free-claude-code 6.4.1__tar.gz → 6.4.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 (911) hide show
  1. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/PKG-INFO +1 -1
  2. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/code_support.py +3 -1
  3. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/conftest.py +1 -0
  4. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/test_claude_desktop_integration.py +12 -5
  5. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/test_connected_accounts.py +11 -2
  6. free_claude_code-6.4.2/e2e/test_messaging_storage_recovery.py +27 -0
  7. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/capabilities.py +5 -5
  8. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/features.py +2 -2
  9. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/lib/e2e.py +17 -5
  10. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_messaging_product_live.py +66 -34
  11. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/admin.js +3 -3
  12. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/command_context.py +2 -2
  13. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/commands.py +4 -4
  14. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/node_runner.py +11 -15
  15. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/trees/__init__.py +5 -0
  16. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/trees/graph.py +14 -0
  17. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/trees/manager.py +206 -82
  18. free_claude_code-6.4.2/src/free_claude_code/messaging/trees/ports.py +35 -0
  19. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/trees/processor.py +16 -1
  20. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/trees/repository.py +11 -0
  21. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/trees/runtime.py +38 -0
  22. free_claude_code-6.4.2/src/free_claude_code/messaging/trees/transaction.py +51 -0
  23. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/trees/transitions.py +1 -0
  24. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/turn_intake.py +3 -8
  25. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/workflow.py +55 -62
  26. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/application.py +61 -12
  27. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/bootstrap.py +6 -5
  28. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/code_sessions_sqlite.py +15 -58
  29. free_claude_code-6.4.2/src/free_claude_code/runtime/messaging_import.py +206 -0
  30. free_claude_code-6.4.2/src/free_claude_code/runtime/messaging_sqlite.py +183 -0
  31. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/sqlite_database.py +115 -3
  32. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/sqlite_migrations/__init__.py +7 -1
  33. free_claude_code-6.4.2/src/free_claude_code/runtime/sqlite_migrations/v0004_messaging_schema.py +108 -0
  34. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_code_sessions_routes.py +5 -3
  35. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/application/test_code_sessions.py +69 -21
  36. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/code_sessions_support.py +8 -0
  37. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/conftest.py +57 -10
  38. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_handler.py +70 -192
  39. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_handler_markdown_and_status_edges.py +56 -6
  40. free_claude_code-6.4.2/tests/messaging/test_messaging.py +125 -0
  41. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_platform_voice_flow.py +1 -1
  42. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_restart_reply_restore.py +35 -33
  43. free_claude_code-6.4.2/tests/messaging/test_storage_controls.py +386 -0
  44. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_tree_concurrency.py +8 -6
  45. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_tree_customer_regressions.py +4 -3
  46. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_tree_ownership_concurrency.py +18 -13
  47. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_tree_processor.py +9 -4
  48. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_tree_repository.py +8 -3
  49. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_application_runtime.py +2 -91
  50. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_code_sessions_sqlite.py +83 -18
  51. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_codex_app_server.py +10 -5
  52. free_claude_code-6.4.2/tests/runtime/test_messaging_sqlite.py +985 -0
  53. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_sqlite_database.py +45 -10
  54. free_claude_code-6.4.1/src/free_claude_code/messaging/session/__init__.py +0 -5
  55. free_claude_code-6.4.1/src/free_claude_code/messaging/session/managed_message_log.py +0 -135
  56. free_claude_code-6.4.1/src/free_claude_code/messaging/session/persistence.py +0 -161
  57. free_claude_code-6.4.1/src/free_claude_code/messaging/session/store.py +0 -162
  58. free_claude_code-6.4.1/tests/messaging/test_messaging.py +0 -241
  59. free_claude_code-6.4.1/tests/messaging/test_session_store_edge_cases.py +0 -680
  60. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/.gitattributes +0 -0
  61. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  62. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  63. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  64. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/.github/ISSUE_TEMPLATE/installation-problem.yml +0 -0
  65. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/.github/actions/ci-environment/action.yml +0 -0
  66. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/.github/dependabot.yml +0 -0
  67. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/.github/workflows/post-merge.yml +0 -0
  68. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/.github/workflows/tests.yml +0 -0
  69. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/.github/workflows/validate-bug-report-version.yml +0 -0
  70. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/.github/workflows/version-policy.yml +0 -0
  71. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/.gitignore +0 -0
  72. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/CONTRIBUTING.md +0 -0
  73. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/LICENSE +0 -0
  74. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/README.md +0 -0
  75. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/assets/admin-messaging.png +0 -0
  76. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/assets/admin-page.png +0 -0
  77. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/assets/browser-code-session.png +0 -0
  78. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/assets/cc-model-picker.png +0 -0
  79. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/assets/codex-model-picker.png +0 -0
  80. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/assets/codex.png +0 -0
  81. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/assets/free-claude-code-wordmark-dark.svg +0 -0
  82. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/assets/free-claude-code-wordmark-light.svg +0 -0
  83. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/assets/how-it-works.mmd +0 -0
  84. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/assets/how-it-works.svg +0 -0
  85. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/assets/package-manager-uv.svg +0 -0
  86. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/assets/pic.png +0 -0
  87. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/conftest.py +0 -0
  88. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/__init__.py +0 -0
  89. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/form_support.py +0 -0
  90. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/provider_support.py +0 -0
  91. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/server_shutdown.py +0 -0
  92. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/test_admin_apply.py +0 -0
  93. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/test_admin_assets.py +0 -0
  94. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/test_admin_integrations.py +0 -0
  95. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/test_admin_models.py +0 -0
  96. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/test_admin_providers.py +0 -0
  97. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/test_admin_vscode_chat.py +0 -0
  98. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/test_code_sessions.py +0 -0
  99. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/test_custom_providers.py +0 -0
  100. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/test_integration_notices.py +0 -0
  101. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/test_jetbrains_acp_integration.py +0 -0
  102. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/test_progressive_startup.py +0 -0
  103. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/test_provider_modals.py +0 -0
  104. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/test_tool_schema_patterns.py +0 -0
  105. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/e2e/thread_diagnostics.py +0 -0
  106. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/pyproject.toml +0 -0
  107. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/scripts/check_version_policy.py +0 -0
  108. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/scripts/ci.ps1 +0 -0
  109. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/scripts/ci.sh +0 -0
  110. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/scripts/install-muse.ps1 +0 -0
  111. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/scripts/install.ps1 +0 -0
  112. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/scripts/install.sh +0 -0
  113. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/scripts/publish_release.py +0 -0
  114. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/scripts/uninstall-muse.ps1 +0 -0
  115. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/scripts/uninstall.ps1 +0 -0
  116. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/scripts/uninstall.sh +0 -0
  117. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/scripts/update/fcc-update +0 -0
  118. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/scripts/update/fcc-update.cmd +0 -0
  119. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/scripts/validate_release.py +0 -0
  120. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/README.md +0 -0
  121. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/__init__.py +0 -0
  122. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/assets/vision-fcc.png +0 -0
  123. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/conftest.py +0 -0
  124. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/installers/AGENTS.md +0 -0
  125. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/installers/_pty_runner.py +0 -0
  126. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/installers/conftest.py +0 -0
  127. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/installers/fixtures/.gitattributes +0 -0
  128. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/installers/fixtures/README.md +0 -0
  129. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/installers/fixtures/rtk-LICENSE +0 -0
  130. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/installers/fixtures/rtk-opencode-v1.ts +0 -0
  131. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/installers/test_installers.py +0 -0
  132. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/installers/test_muse_windows_lifecycle.py +0 -0
  133. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/installers/test_powershell_cache.py +0 -0
  134. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/installers/test_uninstallers.py +0 -0
  135. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/lib/__init__.py +0 -0
  136. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/lib/child_process.py +0 -0
  137. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/lib/claude_cli_matrix.py +0 -0
  138. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/lib/config.py +0 -0
  139. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/lib/http.py +0 -0
  140. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/lib/local_providers.py +0 -0
  141. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/lib/outcomes.py +0 -0
  142. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/lib/report.py +0 -0
  143. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/lib/report_summary.py +0 -0
  144. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/lib/server.py +0 -0
  145. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/lib/skips.py +0 -0
  146. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/prereq/__init__.py +0 -0
  147. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/prereq/test_api_prereq_live.py +0 -0
  148. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/prereq/test_auth_prereq_live.py +0 -0
  149. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/prereq/test_cli_prereq_live.py +0 -0
  150. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/prereq/test_client_shapes_prereq_live.py +0 -0
  151. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/prereq/test_local_provider_endpoints_prereq_live.py +0 -0
  152. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/prereq/test_messaging_prereq_live.py +0 -0
  153. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/prereq/test_provider_prereq_live.py +0 -0
  154. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/prereq/test_tools_prereq_live.py +0 -0
  155. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/prereq/test_voice_prereq_live.py +0 -0
  156. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/__init__.py +0 -0
  157. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_api_product_live.py +0 -0
  158. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_auth_product_live.py +0 -0
  159. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_cli_package_product_live.py +0 -0
  160. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_client_product_live.py +0 -0
  161. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_codex_modes_product_live.py +0 -0
  162. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_config_extensibility_product_live.py +0 -0
  163. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_live_platform_product_live.py +0 -0
  164. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_local_provider_product_live.py +0 -0
  165. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_model_fallback_product_live.py +0 -0
  166. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_nvidia_nim_cli_product_live.py +0 -0
  167. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_nvidia_nim_vision_product_live.py +0 -0
  168. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_openrouter_free_cli_product_live.py +0 -0
  169. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_provider_product_live.py +0 -0
  170. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_runtime_ownership_product_live.py +0 -0
  171. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/smoke/product/test_voice_product_live.py +0 -0
  172. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/__init__.py +0 -0
  173. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/__init__.py +0 -0
  174. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_cache.py +0 -0
  175. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_routes.py +0 -0
  176. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_security.py +0 -0
  177. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/admin.css +0 -0
  178. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/code_sessions.css +0 -0
  179. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/code_sessions.js +0 -0
  180. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/form_controls.js +0 -0
  181. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/index.html +0 -0
  182. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/model_combobox.js +0 -0
  183. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/LICENSE-llamacpp.txt +0 -0
  184. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/LICENSE-lobe-icons.txt +0 -0
  185. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/SOURCES.md +0 -0
  186. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/agnesai.svg +0 -0
  187. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/azure-color.svg +0 -0
  188. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/bedrock-color.svg +0 -0
  189. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/cerebras-color.svg +0 -0
  190. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/cheaperinference.svg +0 -0
  191. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/chutes.png +0 -0
  192. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/cline.svg +0 -0
  193. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/cloudflare-color.svg +0 -0
  194. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/cohere-color.svg +0 -0
  195. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/deepinfra-color.svg +0 -0
  196. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/deepseek-color.svg +0 -0
  197. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/experiential.svg +0 -0
  198. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/featherless-color.svg +0 -0
  199. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/fireworks-color.svg +0 -0
  200. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/gemini-color.svg +0 -0
  201. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/githubcopilot.svg +0 -0
  202. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/groq.svg +0 -0
  203. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/huggingface-color.svg +0 -0
  204. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/kilocode.svg +0 -0
  205. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/kimi-color.svg +0 -0
  206. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/lightning.png +0 -0
  207. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/llamacpp.svg +0 -0
  208. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/llm7.png +0 -0
  209. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/lmstudio.svg +0 -0
  210. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/minimax-color.svg +0 -0
  211. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/mistral-color.svg +0 -0
  212. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/nararoute.png +0 -0
  213. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/nebius.svg +0 -0
  214. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/novita-color.svg +0 -0
  215. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/nvidia-color.svg +0 -0
  216. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/ollama.svg +0 -0
  217. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/openai.svg +0 -0
  218. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/opencode.svg +0 -0
  219. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/openrouter.svg +0 -0
  220. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/orcarouter.png +0 -0
  221. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/poolside-color.svg +0 -0
  222. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/qwen-color.svg +0 -0
  223. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/sambanova-color.svg +0 -0
  224. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/scaleway.svg +0 -0
  225. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/siliconcloud-color.svg +0 -0
  226. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/together-color.svg +0 -0
  227. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/tokenrouter.png +0 -0
  228. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/vercel.svg +0 -0
  229. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/vertexai-color.svg +0 -0
  230. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/wafer.png +0 -0
  231. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/wandb.png +0 -0
  232. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/xai.svg +0 -0
  233. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/zai.svg +0 -0
  234. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/providers/zenmux.svg +0 -0
  235. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/session_layout.css +0 -0
  236. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/admin_static/session_ui.js +0 -0
  237. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/app.py +0 -0
  238. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/code_sessions_routes.py +0 -0
  239. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/command_utils.py +0 -0
  240. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/dependencies.py +0 -0
  241. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/detection.py +0 -0
  242. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/handlers/__init__.py +0 -0
  243. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/handlers/classifier_response.py +0 -0
  244. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/handlers/messages.py +0 -0
  245. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/handlers/responses.py +0 -0
  246. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/handlers/token_count.py +0 -0
  247. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/markdown.py +0 -0
  248. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/model_catalog.py +0 -0
  249. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/optimization_handlers.py +0 -0
  250. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/ports.py +0 -0
  251. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/request_errors.py +0 -0
  252. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/request_ids.py +0 -0
  253. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/request_lifetime.py +0 -0
  254. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/response_streams.py +0 -0
  255. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/routes.py +0 -0
  256. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/api/validation_log.py +0 -0
  257. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/__init__.py +0 -0
  258. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/code_sessions/__init__.py +0 -0
  259. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/code_sessions/models.py +0 -0
  260. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/code_sessions/ports.py +0 -0
  261. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/code_sessions/service.py +0 -0
  262. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/code_sessions/state.py +0 -0
  263. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/connected_accounts.py +0 -0
  264. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/errors.py +0 -0
  265. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/execution.py +0 -0
  266. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/model_catalog.py +0 -0
  267. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/model_metadata.py +0 -0
  268. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/ports.py +0 -0
  269. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/readiness.py +0 -0
  270. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/reasoning.py +0 -0
  271. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/routing.py +0 -0
  272. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/session_events.py +0 -0
  273. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/web_tools/__init__.py +0 -0
  274. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/web_tools/ports.py +0 -0
  275. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/web_tools/request.py +0 -0
  276. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/application/web_tools/service.py +0 -0
  277. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/assets/app-icon.icns +0 -0
  278. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/assets/app-icon.ico +0 -0
  279. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/assets/app-icon.png +0 -0
  280. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/assets/app-icon.svg +0 -0
  281. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/__init__.py +0 -0
  282. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/clipboard.py +0 -0
  283. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/commands.py +0 -0
  284. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/desktop.py +0 -0
  285. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/desktop_assets.py +0 -0
  286. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/desktop_entrypoint.py +0 -0
  287. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/desktop_tray.py +0 -0
  288. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/doctor.py +0 -0
  289. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/entrypoints.py +0 -0
  290. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/__init__.py +0 -0
  291. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/aider.py +0 -0
  292. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/aider_config.py +0 -0
  293. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/catalog_http.py +0 -0
  294. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/claude.py +0 -0
  295. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/cline.py +0 -0
  296. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/cline_config.py +0 -0
  297. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/codex.py +0 -0
  298. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/common.py +0 -0
  299. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/dsh.py +0 -0
  300. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/dsh_config.py +0 -0
  301. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/grok.py +0 -0
  302. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/hermes.py +0 -0
  303. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/hermes_config.py +0 -0
  304. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/muse.py +0 -0
  305. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/opencode.py +0 -0
  306. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/opencode_config.py +0 -0
  307. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/pi.py +0 -0
  308. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/pi_extension.ts +0 -0
  309. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/launchers/runner.py +0 -0
  310. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/local_http.py +0 -0
  311. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/managed/__init__.py +0 -0
  312. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/managed/claude.py +0 -0
  313. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/managed/diagnostics.py +0 -0
  314. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/managed/manager.py +0 -0
  315. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/managed/session.py +0 -0
  316. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/process_registry.py +0 -0
  317. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/server_socket.py +0 -0
  318. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/cli/uvicorn_server.py +0 -0
  319. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/__init__.py +0 -0
  320. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/admin/__init__.py +0 -0
  321. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/admin/custom_providers.py +0 -0
  322. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/admin/manifest.py +0 -0
  323. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/admin/persistence.py +0 -0
  324. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/admin/provider_manifest.py +0 -0
  325. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/admin/specs.py +0 -0
  326. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/admin/state.py +0 -0
  327. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/admin/status.py +0 -0
  328. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/admin/validation.py +0 -0
  329. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/admin/values.py +0 -0
  330. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/constants.py +0 -0
  331. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/custom_providers.py +0 -0
  332. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/env_files.py +0 -0
  333. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/env_migrations.py +0 -0
  334. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/loader.py +0 -0
  335. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/logging_config.py +0 -0
  336. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/model_refs.py +0 -0
  337. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/nim.py +0 -0
  338. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/paths.py +0 -0
  339. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/provider_catalog.py +0 -0
  340. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/provider_proxies.py +0 -0
  341. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/reasoning.py +0 -0
  342. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/server_urls.py +0 -0
  343. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/config/settings.py +0 -0
  344. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/__init__.py +0 -0
  345. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/__init__.py +0 -0
  346. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/content.py +0 -0
  347. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/conversion.py +0 -0
  348. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/errors.py +0 -0
  349. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/image_sources.py +0 -0
  350. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/models.py +0 -0
  351. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/native.py +0 -0
  352. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/native_stream.py +0 -0
  353. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/request_serialization.py +0 -0
  354. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/request_snapshot.py +0 -0
  355. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/server_tool_sse.py +0 -0
  356. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/server_tool_types.py +0 -0
  357. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/sse_aggregation.py +0 -0
  358. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/stream_contracts.py +0 -0
  359. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/streaming/__init__.py +0 -0
  360. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/streaming/decoder.py +0 -0
  361. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/streaming/emitter.py +0 -0
  362. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/streaming/ledger.py +0 -0
  363. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/streaming/recovery.py +0 -0
  364. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/thinking.py +0 -0
  365. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/tokens.py +0 -0
  366. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/tool_results.py +0 -0
  367. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/tool_schema.py +0 -0
  368. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/tools.py +0 -0
  369. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/usage.py +0 -0
  370. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/anthropic/utils.py +0 -0
  371. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/async_iterators.py +0 -0
  372. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/async_tasks.py +0 -0
  373. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/data/README.md +0 -0
  374. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/data/TIKTOKEN-LICENSE +0 -0
  375. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/data/cl100k_base.tiktoken +0 -0
  376. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/diagnostics.py +0 -0
  377. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/failures.py +0 -0
  378. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/gateway_model_ids.py +0 -0
  379. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/history_replay.py +0 -0
  380. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/interprocess_lock.py +0 -0
  381. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/json_types.py +0 -0
  382. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/model_capabilities.py +0 -0
  383. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_chat.py +0 -0
  384. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/__init__.py +0 -0
  385. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/chat_request.py +0 -0
  386. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/errors.py +0 -0
  387. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/events.py +0 -0
  388. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/ids.py +0 -0
  389. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/items.py +0 -0
  390. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/messages_request.py +0 -0
  391. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/messages_stream.py +0 -0
  392. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/models.py +0 -0
  393. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/native.py +0 -0
  394. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/provider_input.py +0 -0
  395. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/provider_stream.py +0 -0
  396. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/reasoning.py +0 -0
  397. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/streaming/__init__.py +0 -0
  398. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/streaming/blocks.py +0 -0
  399. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/streaming/completion.py +0 -0
  400. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/streaming/error_mapping.py +0 -0
  401. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/streaming/event_builders.py +0 -0
  402. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/streaming/ledger.py +0 -0
  403. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/tokens.py +0 -0
  404. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/tool_adaptation.py +0 -0
  405. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/tool_search.py +0 -0
  406. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_responses/tools.py +0 -0
  407. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/openai_tool_names.py +0 -0
  408. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/rate_limit.py +0 -0
  409. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/reasoning.py +0 -0
  410. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/token_estimation.py +0 -0
  411. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/tool_schema_patterns.py +0 -0
  412. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/trace.py +0 -0
  413. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/version.py +0 -0
  414. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/web_tools.py +0 -0
  415. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/core/windows_dpi.py +0 -0
  416. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/harnesses/__init__.py +0 -0
  417. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/harnesses/claude.py +0 -0
  418. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/harnesses/claude_desktop_integration.py +0 -0
  419. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/harnesses/claude_integration.py +0 -0
  420. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/harnesses/codex.py +0 -0
  421. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/harnesses/codex_integration.py +0 -0
  422. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/harnesses/codex_model_catalog.py +0 -0
  423. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/harnesses/config_file.py +0 -0
  424. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/harnesses/environment.py +0 -0
  425. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/harnesses/jetbrains_acp_integration.py +0 -0
  426. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/harnesses/launch.py +0 -0
  427. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/harnesses/model_policy.py +0 -0
  428. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/harnesses/resources.py +0 -0
  429. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/harnesses/vscode_chat_integration.py +0 -0
  430. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/__init__.py +0 -0
  431. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/cli_event_constants.py +0 -0
  432. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/command_dispatcher.py +0 -0
  433. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/event_parser.py +0 -0
  434. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/limiter.py +0 -0
  435. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/managed_protocols.py +0 -0
  436. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/models.py +0 -0
  437. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/node_event_pipeline.py +2 -2
  438. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/platforms/__init__.py +0 -0
  439. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/platforms/discord.py +0 -0
  440. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/platforms/discord_inbound.py +0 -0
  441. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/platforms/discord_io.py +0 -0
  442. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/platforms/factory.py +0 -0
  443. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/platforms/outbox.py +0 -0
  444. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/platforms/ports.py +0 -0
  445. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/platforms/telegram.py +0 -0
  446. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/platforms/telegram_inbound.py +0 -0
  447. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/platforms/telegram_io.py +0 -0
  448. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/platforms/voice_flow.py +0 -0
  449. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/rendering/__init__.py +0 -0
  450. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/rendering/discord_markdown.py +0 -0
  451. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/rendering/markdown_tables.py +0 -0
  452. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/rendering/profiles.py +0 -0
  453. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/rendering/telegram_markdown.py +0 -0
  454. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/safe_diagnostics.py +0 -0
  455. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/transcript/__init__.py +0 -0
  456. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/transcript/buffer.py +0 -0
  457. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/transcript/context.py +0 -0
  458. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/transcript/renderer.py +0 -0
  459. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/transcript/segments.py +0 -0
  460. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/transcript/subagents.py +0 -0
  461. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/transcription.py +0 -0
  462. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/trees/identity.py +0 -0
  463. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/trees/node.py +0 -0
  464. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/trees/queue.py +0 -0
  465. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/trees/snapshot.py +0 -0
  466. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/ui_updates.py +0 -0
  467. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/messaging/voice.py +0 -0
  468. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/__init__.py +0 -0
  469. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/admission.py +0 -0
  470. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/anthropic_messages/__init__.py +0 -0
  471. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/anthropic_messages/request_policy.py +0 -0
  472. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/anthropic_messages/transport.py +0 -0
  473. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/base.py +0 -0
  474. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/cloudflare/__init__.py +0 -0
  475. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/cloudflare/client.py +0 -0
  476. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/credential_validation.py +0 -0
  477. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/custom.py +0 -0
  478. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/deepseek/__init__.py +0 -0
  479. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/deepseek/client.py +0 -0
  480. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/deepseek/compat.py +0 -0
  481. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/endpoint.py +0 -0
  482. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/endpoint_types.py +0 -0
  483. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/failure_policy.py +0 -0
  484. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/gemini/__init__.py +0 -0
  485. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/gemini/client.py +0 -0
  486. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/github_copilot/__init__.py +0 -0
  487. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/github_copilot/auth.py +0 -0
  488. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/github_copilot/broker.py +0 -0
  489. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/github_copilot/lifecycle.py +0 -0
  490. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/github_copilot/login.py +0 -0
  491. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/github_copilot/native_cli.py +0 -0
  492. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/github_copilot/provider.py +0 -0
  493. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/github_copilot/request_policy.py +0 -0
  494. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/github_copilot/responses_events.py +0 -0
  495. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/github_copilot/sdk.py +0 -0
  496. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/github_copilot/types.py +0 -0
  497. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/google_openai/__init__.py +0 -0
  498. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/google_openai/provider.py +0 -0
  499. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/google_openai/reasoning.py +0 -0
  500. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/google_openai/thought_signatures.py +0 -0
  501. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/groq/__init__.py +0 -0
  502. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/groq/client.py +0 -0
  503. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/groq/tpm.py +0 -0
  504. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/history_replay.py +0 -0
  505. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/http.py +0 -0
  506. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/kilo/__init__.py +0 -0
  507. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/kilo/client.py +0 -0
  508. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/kilo/models.py +0 -0
  509. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/lmstudio/__init__.py +0 -0
  510. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/lmstudio/client.py +0 -0
  511. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/mistral/__init__.py +0 -0
  512. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/mistral/client.py +0 -0
  513. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/mistral/reasoning.py +0 -0
  514. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/model_listing.py +0 -0
  515. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/nvidia_nim/__init__.py +0 -0
  516. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/nvidia_nim/client.py +0 -0
  517. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/nvidia_nim/native_tool_stream.py +0 -0
  518. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/nvidia_nim/request_options.py +0 -0
  519. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/nvidia_nim/retry.py +0 -0
  520. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/nvidia_nim/tool_schema.py +0 -0
  521. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/nvidia_nim/voice.py +0 -0
  522. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/open_router/__init__.py +0 -0
  523. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/open_router/client.py +0 -0
  524. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_api/__init__.py +0 -0
  525. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_api/provider.py +0 -0
  526. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_chat/__init__.py +0 -0
  527. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_chat/base_url.py +0 -0
  528. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_chat/behavior.py +0 -0
  529. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_chat/client.py +0 -0
  530. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_chat/extra_body.py +0 -0
  531. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_chat/output_cap.py +0 -0
  532. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_chat/profiles.py +0 -0
  533. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_chat/provider.py +0 -0
  534. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_chat/reasoning.py +0 -0
  535. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_chat/reasoning_details.py +0 -0
  536. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_chat/request_policy.py +0 -0
  537. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_chat/stream_output.py +0 -0
  538. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_chat/tool_calls.py +0 -0
  539. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_chat/transport.py +0 -0
  540. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_chat/usage.py +0 -0
  541. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_client.py +0 -0
  542. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_codex/__init__.py +0 -0
  543. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_codex/auth.py +0 -0
  544. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_codex/endpoint.py +0 -0
  545. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_codex/login.py +0 -0
  546. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_codex/provider.py +0 -0
  547. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_responses/__init__.py +0 -0
  548. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_responses/presentation.py +0 -0
  549. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_responses/transport.py +0 -0
  550. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/openai_stream.py +0 -0
  551. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/opencode/__init__.py +0 -0
  552. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/opencode/catalog.py +0 -0
  553. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/opencode/provider.py +0 -0
  554. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/reasoning_compatibility.py +0 -0
  555. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/request_recovery.py +0 -0
  556. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/runtime/__init__.py +0 -0
  557. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/runtime/config.py +0 -0
  558. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/runtime/discovery.py +0 -0
  559. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/runtime/factory.py +0 -0
  560. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/runtime/model_cache.py +0 -0
  561. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/runtime/runtime.py +0 -0
  562. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/stream_recovery.py +0 -0
  563. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/vertex/__init__.py +0 -0
  564. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/vertex/auth.py +0 -0
  565. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/vertex/client.py +0 -0
  566. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/vertex/endpoint.py +0 -0
  567. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/providers/vertex/models.py +0 -0
  568. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/__init__.py +0 -0
  569. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/asgi.py +0 -0
  570. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/codex_app_server.py +0 -0
  571. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/codex_catalog.py +0 -0
  572. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/codex_protocol.py +0 -0
  573. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/configuration.py +0 -0
  574. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/diagnostics.py +0 -0
  575. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/folder_picker.py +0 -0
  576. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/native_folder_dialog.py +0 -0
  577. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/provider_manager.py +0 -0
  578. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/retired_chat.py +0 -0
  579. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/sqlite_migrations/v0001_code_schema.py +0 -0
  580. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/sqlite_migrations/v0002_code_permissions.py +0 -0
  581. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/sqlite_migrations/v0003_code_context_usage.py +0 -0
  582. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/web_tools/__init__.py +0 -0
  583. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/web_tools/client.py +0 -0
  584. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/web_tools/constants.py +0 -0
  585. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/web_tools/egress.py +0 -0
  586. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/runtime/web_tools/parsers.py +0 -0
  587. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/updater/__init__.py +0 -0
  588. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/src/free_claude_code/updater/check.py +0 -0
  589. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/__init__.py +0 -0
  590. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/model_fallback_support.py +0 -0
  591. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/support.py +0 -0
  592. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_admin.py +0 -0
  593. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_admin_configuration_io.py +0 -0
  594. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_api.py +0 -0
  595. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_api_handlers.py +0 -0
  596. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_app_lifespan_and_errors.py +0 -0
  597. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_app_version.py +0 -0
  598. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_auth.py +0 -0
  599. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_classifier_provider_compatibility.py +0 -0
  600. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_classifier_response.py +0 -0
  601. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_claude_desktop_integration.py +0 -0
  602. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_codex_integration_routes.py +0 -0
  603. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_dependencies.py +0 -0
  604. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_detection.py +0 -0
  605. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_execution_failure_contract.py +0 -0
  606. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_groq_token_limits.py +0 -0
  607. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_jetbrains_acp_integration.py +0 -0
  608. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_managed_proxy_token.py +0 -0
  609. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_markdown.py +0 -0
  610. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_model_fallback.py +0 -0
  611. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_model_listing.py +0 -0
  612. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_openai_codex_compatibility.py +0 -0
  613. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_openai_responses.py +0 -0
  614. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_opencode_session_headers.py +0 -0
  615. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_openrouter_image_errors.py +0 -0
  616. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_optimization_handlers.py +0 -0
  617. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_ordinary_error_phases.py +0 -0
  618. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_request_ids.py +0 -0
  619. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_request_lifetime.py +0 -0
  620. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_request_utils.py +0 -0
  621. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_request_utils_filepaths_and_suggestions.py +0 -0
  622. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_response_streams.py +0 -0
  623. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_routes_optimizations.py +0 -0
  624. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_runtime_safe_logging.py +0 -0
  625. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_safe_logging.py +0 -0
  626. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_validation_log.py +0 -0
  627. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_vscode_chat_routes.py +0 -0
  628. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_vscode_integration.py +0 -0
  629. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/api/test_web_server_tools.py +0 -0
  630. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/application/test_code_sessions_state.py +0 -0
  631. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/application/test_connected_accounts.py +0 -0
  632. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/application/test_execution.py +0 -0
  633. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/application/test_model_catalog.py +0 -0
  634. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/application/test_model_metadata.py +0 -0
  635. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/application/test_reasoning.py +0 -0
  636. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/application/test_request_conversion.py +0 -0
  637. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/application/test_routing.py +0 -0
  638. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/application/test_session_events.py +0 -0
  639. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/application/test_web_tools.py +0 -0
  640. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/conftest.py +0 -0
  641. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_aider_config.py +0 -0
  642. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_aider_launcher.py +0 -0
  643. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_catalog_http.py +0 -0
  644. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_claude_launcher.py +0 -0
  645. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_cli.py +0 -0
  646. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_cli_manager_edge_cases.py +0 -0
  647. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_cli_ownership.py +0 -0
  648. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_cline_launcher.py +0 -0
  649. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_codex_launcher.py +0 -0
  650. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_codex_model_catalog.py +0 -0
  651. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_config_restart_lifecycle.py +0 -0
  652. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_desktop.py +0 -0
  653. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_desktop_assets.py +0 -0
  654. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_doctor.py +0 -0
  655. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_dsh_config.py +0 -0
  656. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_dsh_launcher.py +0 -0
  657. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_entrypoints.py +0 -0
  658. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_grok_launcher.py +0 -0
  659. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_hermes_config.py +0 -0
  660. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_hermes_launcher.py +0 -0
  661. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_launcher_checks.py +0 -0
  662. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_launcher_environment.py +0 -0
  663. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_launcher_resources.py +0 -0
  664. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_launcher_workflow.py +0 -0
  665. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_local_http.py +0 -0
  666. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_managed_claude.py +0 -0
  667. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_managed_session_shutdown.py +0 -0
  668. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_model_catalog_decoder.py +0 -0
  669. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_muse_launcher.py +0 -0
  670. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_opencode_launcher.py +0 -0
  671. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_pi_extension.py +0 -0
  672. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_pi_launcher.py +0 -0
  673. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_process_registry.py +0 -0
  674. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_progressive_launch.py +0 -0
  675. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_server_shutdown.py +0 -0
  676. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_update_check.py +0 -0
  677. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/cli/test_update_wrapper.py +0 -0
  678. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/config/test_admin_credential_changes.py +0 -0
  679. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/config/test_admin_status.py +0 -0
  680. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/config/test_config.py +0 -0
  681. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/config/test_custom_provider_mutations.py +0 -0
  682. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/config/test_custom_providers.py +0 -0
  683. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/config/test_env_migrations.py +0 -0
  684. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/config/test_fixed_cloud_endpoints.py +0 -0
  685. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/config/test_logging_config.py +0 -0
  686. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/config/test_provider_catalog.py +0 -0
  687. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_admin_provider_manifest.py +0 -0
  688. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_capability_map.py +0 -0
  689. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_codex_smoke_storage.py +0 -0
  690. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_feature_manifest.py +0 -0
  691. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_import_boundaries.py +0 -0
  692. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_issue_form_version_validation.py +0 -0
  693. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_issue_forms.py +0 -0
  694. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_local_provider_smoke.py +0 -0
  695. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_nvidia_nim_cli_matrix.py +0 -0
  696. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_offline_startup.py +0 -0
  697. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_packaging_contracts.py +0 -0
  698. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_protocol_matrix.py +0 -0
  699. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_provider_catalog_order.py +0 -0
  700. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_smoke_child_process.py +0 -0
  701. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_smoke_config.py +0 -0
  702. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_smoke_tiers.py +0 -0
  703. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_startup_import_boundaries.py +0 -0
  704. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_stream_contracts.py +0 -0
  705. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/contracts/test_uv_policy.py +0 -0
  706. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_errors.py +0 -0
  707. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_image_sources.py +0 -0
  708. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_models.py +0 -0
  709. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_native_messages.py +0 -0
  710. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_native_messages_stream.py +0 -0
  711. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_native_sse_framing.py +0 -0
  712. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_openai_tool_names.py +0 -0
  713. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_request_serialization.py +0 -0
  714. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_response_models.py +0 -0
  715. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_server_tool_sse.py +0 -0
  716. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_sse_decoder.py +0 -0
  717. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_stream_ledger.py +0 -0
  718. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_stream_repair.py +0 -0
  719. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_text_tools.py +0 -0
  720. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_tool_results.py +0 -0
  721. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/anthropic/test_usage.py +0 -0
  722. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/openai_responses/test_chat_request.py +0 -0
  723. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/openai_responses/test_client_tool_discovery.py +0 -0
  724. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/openai_responses/test_messages_request.py +0 -0
  725. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/openai_responses/test_native.py +0 -0
  726. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/openai_responses/test_openai_responses_models.py +0 -0
  727. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/openai_responses/test_provider_input.py +0 -0
  728. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/openai_responses/test_provider_stream.py +0 -0
  729. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/openai_responses/test_reasoning_replay.py +0 -0
  730. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/openai_responses/test_responses_from_messages_stream.py +0 -0
  731. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/openai_responses/test_tokens.py +0 -0
  732. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/openai_responses/test_tool_adaptation.py +0 -0
  733. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/openai_responses/test_tool_search.py +0 -0
  734. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/test_async_iterators.py +0 -0
  735. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/test_desktop_model_ids.py +0 -0
  736. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/test_diagnostics.py +0 -0
  737. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/test_failure_protocol_mapping.py +0 -0
  738. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/test_failures.py +0 -0
  739. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/test_history_replay.py +0 -0
  740. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/test_history_switching.py +0 -0
  741. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/test_openai_chat.py +0 -0
  742. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/test_protocol_model_ownership.py +0 -0
  743. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/test_strict_sliding_window.py +0 -0
  744. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/test_token_estimation.py +0 -0
  745. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/test_tool_schema_patterns.py +0 -0
  746. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/test_trace.py +0 -0
  747. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/test_version.py +0 -0
  748. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/core/test_windows_dpi.py +0 -0
  749. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/harnesses/__init__.py +0 -0
  750. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/harnesses/test_claude_desktop_integration.py +0 -0
  751. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/harnesses/test_claude_integration.py +0 -0
  752. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/harnesses/test_codex_integration.py +0 -0
  753. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/harnesses/test_codex_model_catalog.py +0 -0
  754. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/harnesses/test_environment.py +0 -0
  755. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/harnesses/test_integration_refresh.py +0 -0
  756. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/harnesses/test_jetbrains_acp_integration.py +0 -0
  757. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/harnesses/test_vscode_chat_integration.py +0 -0
  758. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_discord_markdown.py +0 -0
  759. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_discord_platform.py +0 -0
  760. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_event_parser.py +0 -0
  761. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_extract_text.py +0 -0
  762. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_handler_context_isolation.py +0 -0
  763. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_handler_format.py +0 -0
  764. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_handler_integration.py +0 -0
  765. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_limiter.py +0 -0
  766. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_message_tree_transitions.py +0 -0
  767. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_messaging_factory.py +0 -0
  768. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_platform_outbox.py +0 -0
  769. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_reliability.py +0 -0
  770. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_rendering_profiles.py +0 -0
  771. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_robust_formatting.py +0 -0
  772. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_stream_transcript_contract.py +0 -0
  773. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_telegram.py +0 -0
  774. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_telegram_edge_cases.py +0 -0
  775. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_transcript.py +0 -0
  776. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_transcription.py +0 -0
  777. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_transcription_nim.py +0 -0
  778. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_tree_queue.py +0 -0
  779. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_voice_handlers.py +0 -0
  780. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/messaging/test_voice_services.py +0 -0
  781. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/provider_request_mocks.py +0 -0
  782. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/copilot_support.py +0 -0
  783. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/fixtures/copilot_responses_changing_ids.json +0 -0
  784. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/request_factory.py +0 -0
  785. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/support.py +0 -0
  786. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_agnes.py +0 -0
  787. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_anthropic_messages_transport.py +0 -0
  788. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_azure_openai.py +0 -0
  789. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_bedrock.py +0 -0
  790. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_cerebras.py +0 -0
  791. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_cheaperinference.py +0 -0
  792. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_chutes.py +0 -0
  793. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_cline_pass.py +0 -0
  794. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_cloudflare.py +0 -0
  795. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_codestral.py +0 -0
  796. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_cohere.py +0 -0
  797. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_converter.py +0 -0
  798. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_credential_validation.py +0 -0
  799. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_custom_provider.py +0 -0
  800. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_deepinfra.py +0 -0
  801. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_deepseek.py +0 -0
  802. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_endpoint_context_transports.py +0 -0
  803. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_execution_failure_boundary.py +0 -0
  804. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_experiential.py +0 -0
  805. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_failure_policy.py +0 -0
  806. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_featherless.py +0 -0
  807. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_fireworks.py +0 -0
  808. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_gemini.py +0 -0
  809. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_github_copilot_auth.py +0 -0
  810. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_github_copilot_broker.py +0 -0
  811. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_github_copilot_login.py +0 -0
  812. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_github_copilot_provider.py +0 -0
  813. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_github_copilot_responses_identity.py +0 -0
  814. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_github_copilot_sdk.py +0 -0
  815. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_groq.py +0 -0
  816. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_groq_reasoning.py +0 -0
  817. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_groq_tpm.py +0 -0
  818. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_history_corrections.py +0 -0
  819. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_history_transports.py +0 -0
  820. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_huggingface.py +0 -0
  821. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_kilo.py +0 -0
  822. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_kimi.py +0 -0
  823. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_kimi_code.py +0 -0
  824. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_lightning.py +0 -0
  825. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_llamacpp.py +0 -0
  826. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_llm7.py +0 -0
  827. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_lmstudio.py +0 -0
  828. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_messages_request_policy.py +0 -0
  829. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_minimax.py +0 -0
  830. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_mistral.py +0 -0
  831. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_model_discovery.py +0 -0
  832. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_model_token_limit_profiles.py +0 -0
  833. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_nararoute.py +0 -0
  834. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_nebius.py +0 -0
  835. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_novita.py +0 -0
  836. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_nvidia_nim.py +0 -0
  837. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_nvidia_nim_degraded_retry.py +0 -0
  838. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_nvidia_nim_native_tool_stream.py +0 -0
  839. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_nvidia_nim_reasoning.py +0 -0
  840. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_nvidia_nim_request.py +0 -0
  841. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_ollama.py +0 -0
  842. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_open_router.py +0 -0
  843. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_openai_api_provider.py +0 -0
  844. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_openai_api_sampling.py +0 -0
  845. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_openai_chat_output_cap.py +0 -0
  846. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_openai_chat_reasoning.py +0 -0
  847. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_openai_chat_stream_output.py +0 -0
  848. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_openai_chat_tool_names.py +0 -0
  849. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_openai_chat_transport.py +0 -0
  850. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_openai_chat_usage.py +0 -0
  851. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_openai_codex_auth.py +0 -0
  852. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_openai_codex_provider.py +0 -0
  853. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_openai_compat_5xx_retry.py +0 -0
  854. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_openai_model_listing_filters.py +0 -0
  855. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_openai_responses_transport.py +0 -0
  856. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_opencode.py +0 -0
  857. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_orcarouter.py +0 -0
  858. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_parsers.py +0 -0
  859. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_poolside.py +0 -0
  860. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_provider_admission.py +0 -0
  861. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_provider_client_tool_discovery.py +0 -0
  862. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_provider_runtime.py +0 -0
  863. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_provider_transport_logging.py +0 -0
  864. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_qwencloud.py +0 -0
  865. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_qwencloud_coding.py +0 -0
  866. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_reasoning_capabilities.py +0 -0
  867. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_reasoning_compatibility.py +0 -0
  868. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_request_recovery_transitions.py +0 -0
  869. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_sambanova.py +0 -0
  870. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_scaleway.py +0 -0
  871. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_sdk_stream_lifecycle.py +0 -0
  872. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_siliconflow.py +0 -0
  873. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_stream_recovery.py +0 -0
  874. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_stream_startup_contract.py +0 -0
  875. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_streaming_errors.py +0 -0
  876. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_subagent_interception.py +0 -0
  877. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_together.py +0 -0
  878. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_vercel.py +0 -0
  879. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_vertex.py +0 -0
  880. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_wafer.py +0 -0
  881. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_wandb.py +0 -0
  882. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_xai.py +0 -0
  883. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_zai.py +0 -0
  884. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/providers/test_zenmux.py +0 -0
  885. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/codex_fake_process.py +0 -0
  886. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/fixtures/code_schema_v0.sql +0 -0
  887. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_codex_catalog.py +0 -0
  888. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_codex_protocol.py +0 -0
  889. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_config_startup.py +0 -0
  890. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_config_transactions.py +0 -0
  891. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_configuration.py +0 -0
  892. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_custom_provider_lifecycle.py +0 -0
  893. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_folder_picker.py +0 -0
  894. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_integration_startup.py +0 -0
  895. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_model_cache.py +0 -0
  896. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_native_folder_dialog.py +0 -0
  897. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_progressive_startup.py +0 -0
  898. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_provider_manager.py +0 -0
  899. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_retired_chat.py +0 -0
  900. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_vscode_chat_sync.py +0 -0
  901. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/runtime/test_web_tools_client.py +0 -0
  902. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/scripts/conftest.py +0 -0
  903. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/scripts/test_ci_scripts.py +0 -0
  904. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/scripts/test_publish_release.py +0 -0
  905. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/scripts/test_release_package.py +0 -0
  906. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/scripts/test_release_workflow.py +0 -0
  907. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/scripts/test_version_policy.py +0 -0
  908. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/test_browser_server_shutdown.py +0 -0
  909. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/test_thread_diagnostics.py +0 -0
  910. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/tests/web_tools_support.py +0 -0
  911. {free_claude_code-6.4.1 → free_claude_code-6.4.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: free-claude-code
3
- Version: 6.4.1
3
+ Version: 6.4.2
4
4
  Summary: Local proxy connecting coding agents to OpenAI-compatible AI providers
5
5
  License-Expression: AGPL-3.0-only
6
6
  License-File: LICENSE
@@ -6,6 +6,7 @@ from unittest.mock import patch
6
6
 
7
7
  from free_claude_code.application.code_sessions import CodeService
8
8
  from free_claude_code.runtime.code_sessions_sqlite import SQLiteCodeStore
9
+ from free_claude_code.runtime.sqlite_database import SQLiteDatabase
9
10
  from tests.code_sessions_support import FakeHarness
10
11
 
11
12
 
@@ -13,8 +14,9 @@ class CodeControl:
13
14
  def __init__(self, directory):
14
15
  self.harness = FakeHarness()
15
16
  self.folder_picker = FolderPickerControl()
17
+ self.database = SQLiteDatabase(directory / "fcc.db", directory / "code.lock")
16
18
  self.service = CodeService(
17
- SQLiteCodeStore(directory / "code.db", directory / "code.lock"),
19
+ SQLiteCodeStore(self.database),
18
20
  self.harness,
19
21
  )
20
22
  self.loop: asyncio.AbstractEventLoop | None = None
@@ -268,6 +268,7 @@ def admin_base_url(
268
268
  configuration=ConfigurationService(ManagedConfigStore()),
269
269
  transcriber=None,
270
270
  code_service=code_control.service,
271
+ database=code_control.database,
271
272
  )
272
273
  monkeypatch.setattr(
273
274
  NativeFolderPicker,
@@ -38,19 +38,26 @@ def test_real_disconnect_failure_keeps_retry_after_reload(
38
38
  ),
39
39
  )
40
40
  elif status_failure == "startup":
41
+ marker = tmp_path / ".fcc/claude-desktop-disconnect.json"
42
+ failed = {"state": "failed", "message": "Startup check failed"}
41
43
 
42
44
  def failed_update(route):
43
45
  result = route.fetch()
44
46
  body = result.json()
45
- if body["disconnect_pending"]:
47
+ if marker.exists():
46
48
  body["connected"] = None
47
- body["update"] = {
48
- "state": "failed",
49
- "message": "Startup check failed",
50
- }
49
+ body["update"] = failed
50
+ route.fulfill(response=result, json=body)
51
+
52
+ def failed_startup(route):
53
+ result = route.fetch()
54
+ body = result.json()
55
+ if marker.exists():
56
+ body["startup"]["integrations"]["claude-desktop"] = failed
51
57
  route.fulfill(response=result, json=body)
52
58
 
53
59
  page.route(endpoint, failed_update)
60
+ page.route("**/admin/api/status", failed_startup)
54
61
  dialog.get_by_role("button", name="Disconnect", exact=True).click()
55
62
  expect(
56
63
  dialog.get_by_role(
@@ -66,6 +66,14 @@ class _Accounts:
66
66
  page.wait_for_timeout(10)
67
67
  return self.pending_status.pop(0)
68
68
 
69
+ def take_pending_login(self, page: Page) -> Route:
70
+ deadline = time.monotonic() + 5
71
+ while not self.pending_login:
72
+ if time.monotonic() >= deadline:
73
+ pytest.fail("Account login request did not reach the route handler")
74
+ page.wait_for_timeout(10)
75
+ return self.pending_login.pop(0)
76
+
69
77
  def config(self, route: Route) -> None:
70
78
  response = route.fetch()
71
79
  config = response.json()
@@ -247,9 +255,10 @@ def test_openai_connect_uses_browser_login(
247
255
  try:
248
256
  assert popup.url == "about:blank"
249
257
  assert popup.evaluate("window.opener === null") is True
258
+ login = accounts.take_pending_login(page)
250
259
  assert accounts.login_requests == [("openai", "browser")]
251
- assert len(accounts.pending_login) == 1
252
- accounts.pending_login.pop().fulfill(json=accounts.statuses["openai"])
260
+ assert not accounts.pending_login
261
+ login.fulfill(json=accounts.statuses["openai"])
253
262
  popup.wait_for_url(f"{admin_base_url}/account-test-sign-in")
254
263
  finally:
255
264
  popup.close()
@@ -0,0 +1,27 @@
1
+ import pytest
2
+ from playwright.sync_api import expect
3
+
4
+
5
+ @pytest.fixture
6
+ def admin_client_files(tmp_path):
7
+ source = tmp_path / ".fcc/agent_workspace/sessions.json"
8
+ source.parent.mkdir(parents=True)
9
+ source.write_text('{"conversation":')
10
+ return source
11
+
12
+
13
+ def test_damaged_legacy_history_warns_without_blocking_settings(
14
+ page, admin_base_url, admin_client_files
15
+ ):
16
+ page.goto(f"{admin_base_url}/admin")
17
+ page.get_by_role("button", name="Messaging", exact=True).click()
18
+ notice = page.locator("#startupMessage")
19
+ expect(notice).to_be_visible()
20
+ expect(notice).to_contain_text("Messaging can still be used")
21
+ expect(page.locator("#field-TELEGRAM_BOT_TOKEN")).to_be_enabled()
22
+ assert admin_client_files.read_text() == '{"conversation":'
23
+ # A preserved source is not a second writer, and the server stays usable.
24
+ response = page.request.get(f"{admin_base_url}/health")
25
+ assert response.ok
26
+ page.get_by_role("button", name="Providers", exact=True).click()
27
+ expect(notice).to_be_hidden()
@@ -491,7 +491,7 @@ CAPABILITY_CONTRACTS: tuple[CapabilityContract, ...] = (
491
491
  "persistence",
492
492
  "restart_restore",
493
493
  "restart_restore",
494
- "free_claude_code.messaging.session.SessionStore",
494
+ "free_claude_code.runtime.messaging_sqlite.SQLiteMessagingStore",
495
495
  "stored tree JSON",
496
496
  "restored scoped reply lookup",
497
497
  "stale pending work marked lost",
@@ -501,11 +501,11 @@ CAPABILITY_CONTRACTS: tuple[CapabilityContract, ...] = (
501
501
  "persistence",
502
502
  "session_store",
503
503
  "session_persistence",
504
- "free_claude_code.messaging.session.SessionStore",
504
+ "free_claude_code.runtime.messaging_sqlite.SQLiteMessagingStore",
505
505
  "scoped tree data and message log",
506
- "JSON persistence compatible with existing files",
507
- "best-effort flush error logging",
508
- ("tests/messaging/test_session_store_edge_cases.py",),
506
+ "transactional SQLite persistence with one-time legacy JSON import",
507
+ "storage failures propagate to the owning messaging operation",
508
+ ("tests/runtime/test_messaging_sqlite.py",),
509
509
  ),
510
510
  CapabilityContract(
511
511
  "voice",
@@ -638,8 +638,8 @@ FEATURE_INVENTORY: tuple[FeatureCoverage, ...] = (
638
638
  ),
639
639
  FeatureCoverage(
640
640
  "session_persistence",
641
- "Session JSON preserves scoped trees and message logs",
642
- ("tests/messaging/test_session_store_edge_cases.py",),
641
+ "SQLite persistence preserves scoped trees and message logs",
642
+ ("tests/runtime/test_messaging_sqlite.py",),
643
643
  (),
644
644
  ("test_restart_restore_and_session_persistence_e2e",),
645
645
  ("messaging",),
@@ -27,9 +27,10 @@ from free_claude_code.core.anthropic.stream_contracts import (
27
27
  )
28
28
  from free_claude_code.harnesses.claude import build_claude_proxy_env
29
29
  from free_claude_code.messaging.models import IncomingMessage, MessageScope
30
- from free_claude_code.messaging.session import SessionStore
31
30
  from free_claude_code.messaging.voice import VoiceCancellationResult
32
31
  from free_claude_code.messaging.workflow import MessagingWorkflow
32
+ from free_claude_code.runtime.messaging_sqlite import SQLiteMessagingStore
33
+ from free_claude_code.runtime.sqlite_database import SQLiteDatabase
33
34
  from smoke.lib.child_process import run_captured_text
34
35
  from smoke.lib.config import ProviderModel, SmokeConfig, auth_headers
35
36
  from smoke.lib.http import conversation_headers
@@ -568,15 +569,18 @@ class FakePlatformDriver:
568
569
  event_batches: list[list[dict[str, Any]]] | None = None
569
570
  platform: FakePlatform = field(init=False)
570
571
  cli_manager: FakeCLIManager = field(init=False)
571
- session_store: SessionStore = field(init=False)
572
+ session_store: SQLiteMessagingStore = field(init=False)
572
573
  workflow: MessagingWorkflow = field(init=False)
574
+ database: SQLiteDatabase = field(init=False)
573
575
 
574
576
  def __post_init__(self) -> None:
575
577
  self.platform = FakePlatform(self.platform_name)
576
578
  self.cli_manager = FakeCLIManager(self.event_batches)
577
- self.session_store = SessionStore(
578
- storage_path=str(self.tmp_path / f"{self.platform_name}-sessions.json")
579
+ self.database = SQLiteDatabase(
580
+ self.tmp_path / f"{self.platform_name}-fcc.db",
581
+ self.tmp_path / f"{self.platform_name}-fcc.lock",
579
582
  )
583
+ self.session_store = SQLiteMessagingStore(self.database)
580
584
  self.workflow = MessagingWorkflow(
581
585
  self.platform,
582
586
  self.cli_manager,
@@ -586,6 +590,14 @@ class FakePlatformDriver:
586
590
  )
587
591
  self.platform.on_message(self.workflow.handle_message)
588
592
 
593
+ async def start(self) -> None:
594
+ await self.database.start()
595
+ await self.workflow.restore()
596
+
597
+ async def close(self) -> None:
598
+ await self.workflow.close()
599
+ await self.database.close()
600
+
589
601
  async def send(
590
602
  self,
591
603
  text: str,
@@ -628,7 +640,7 @@ class FakePlatformDriver:
628
640
  while time.monotonic() < deadline:
629
641
  pending = [task for task in self.platform._tasks if not task.done()]
630
642
  if not pending and await self._all_tree_nodes_terminal():
631
- self.session_store.flush_pending_save()
643
+ await self.workflow.tree_queue.wait_idle()
632
644
  return
633
645
  await asyncio.sleep(0.02)
634
646
  raise AssertionError("fake platform did not become idle")
@@ -1,7 +1,7 @@
1
1
  import asyncio
2
- import json
3
2
 
4
3
  import pytest
4
+ import pytest_asyncio
5
5
 
6
6
  from free_claude_code.messaging.models import MessageScope
7
7
  from free_claude_code.messaging.platforms.ports import MessagingStartupNotice
@@ -13,8 +13,10 @@ pytestmark = [pytest.mark.live, pytest.mark.smoke_target("messaging")]
13
13
 
14
14
  @pytest.mark.asyncio
15
15
  @pytest.mark.parametrize("platform_name", ["discord", "telegram"])
16
- async def test_messaging_fake_full_flow_e2e(platform_name: str, tmp_path) -> None:
17
- driver = FakePlatformDriver(platform_name, tmp_path)
16
+ async def test_messaging_fake_full_flow_e2e(
17
+ driver_factory, platform_name: str, tmp_path
18
+ ) -> None:
19
+ driver = await driver_factory(platform_name, tmp_path)
18
20
 
19
21
  incoming = await driver.send("Please inspect README.", message_id="root_1")
20
22
 
@@ -33,7 +35,9 @@ async def test_messaging_fake_full_flow_e2e(platform_name: str, tmp_path) -> Non
33
35
 
34
36
  @pytest.mark.asyncio
35
37
  @pytest.mark.parametrize("platform_name", ["discord", "telegram"])
36
- async def test_messaging_subagent_control_e2e(platform_name: str, tmp_path) -> None:
38
+ async def test_messaging_subagent_control_e2e(
39
+ driver_factory, platform_name: str, tmp_path
40
+ ) -> None:
37
41
  task_events = [
38
42
  {"type": "session_info", "session_id": "sess_task"},
39
43
  {
@@ -53,7 +57,7 @@ async def test_messaging_subagent_control_e2e(platform_name: str, tmp_path) -> N
53
57
  },
54
58
  {"type": "exit", "code": 0, "stderr": None},
55
59
  ]
56
- driver = FakePlatformDriver(platform_name, tmp_path, event_batches=[task_events])
60
+ driver = await driver_factory(platform_name, tmp_path, event_batches=[task_events])
57
61
 
58
62
  await driver.send("Delegate this safely.", message_id="root_task")
59
63
 
@@ -65,9 +69,9 @@ async def test_messaging_subagent_control_e2e(platform_name: str, tmp_path) -> N
65
69
  @pytest.mark.asyncio
66
70
  @pytest.mark.parametrize("platform_name", ["discord", "telegram"])
67
71
  async def test_messaging_commands_stop_clear_stats_e2e(
68
- platform_name: str, tmp_path
72
+ driver_factory, platform_name: str, tmp_path
69
73
  ) -> None:
70
- driver = FakePlatformDriver(platform_name, tmp_path)
74
+ driver = await driver_factory(platform_name, tmp_path)
71
75
  root = await driver.send("start work", message_id="root_1")
72
76
  root_status_id = driver.platform.sent[-1]["message_id"]
73
77
 
@@ -90,16 +94,17 @@ async def test_messaging_commands_stop_clear_stats_e2e(
90
94
  "clear_1",
91
95
  "clear_all",
92
96
  } <= deleted
93
- assert driver.session_store.load_conversation_snapshot().trees == {}
97
+ assert (await driver.session_store.load_conversation_snapshot()).trees == {}
94
98
 
95
99
 
96
100
  @pytest.mark.asyncio
97
101
  @pytest.mark.parametrize("platform_name", ["discord", "telegram"])
98
102
  async def test_reply_clear_uses_literal_platform_subtree_e2e(
103
+ driver_factory,
99
104
  platform_name: str,
100
105
  tmp_path,
101
106
  ) -> None:
102
- driver = FakePlatformDriver(platform_name, tmp_path)
107
+ driver = await driver_factory(platform_name, tmp_path)
103
108
  root = await driver.send("root", message_id="root")
104
109
  root_status = driver.platform.sent[-1]["message_id"]
105
110
  sibling = await driver.send(
@@ -158,8 +163,10 @@ async def test_reply_clear_uses_literal_platform_subtree_e2e(
158
163
 
159
164
 
160
165
  @pytest.mark.asyncio
161
- async def test_messaging_startup_notice_is_clearable_e2e(tmp_path) -> None:
162
- first_driver = FakePlatformDriver("telegram", tmp_path)
166
+ async def test_messaging_startup_notice_is_clearable_e2e(
167
+ driver_factory, tmp_path
168
+ ) -> None:
169
+ first_driver = await driver_factory("telegram", tmp_path)
163
170
  scope = MessageScope(platform="telegram", chat_id="chat_1")
164
171
 
165
172
  await first_driver.workflow.publish_startup_notice(
@@ -169,9 +176,9 @@ async def test_messaging_startup_notice_is_clearable_e2e(tmp_path) -> None:
169
176
  )
170
177
  )
171
178
  first_startup_id = first_driver.platform.sent[-1]["message_id"]
172
- first_driver.session_store.flush_pending_save()
173
179
 
174
- driver = FakePlatformDriver("telegram", tmp_path)
180
+ await first_driver.close()
181
+ driver = await driver_factory("telegram", tmp_path)
175
182
  await driver.platform.send_message("untracked", "advance fake message ID")
176
183
  await driver.workflow.publish_startup_notice(
177
184
  MessagingStartupNotice(
@@ -185,7 +192,7 @@ async def test_messaging_startup_notice_is_clearable_e2e(tmp_path) -> None:
185
192
  "🚀 *Claude Code Proxy is online\\!* \\(Bot API\\)"
186
193
  )
187
194
  assert second_startup["parse_mode"] == "MarkdownV2"
188
- assert driver.session_store.get_tracked_message_ids_for_chat(
195
+ assert await driver.session_store.get_tracked_message_ids_for_chat(
189
196
  scope.platform, scope.chat_id
190
197
  ) == [first_startup_id, second_startup_id]
191
198
 
@@ -194,7 +201,7 @@ async def test_messaging_startup_notice_is_clearable_e2e(tmp_path) -> None:
194
201
  deleted = {entry["message_id"] for entry in driver.platform.deletes}
195
202
  assert {first_startup_id, second_startup_id, "clear_startup"} <= deleted
196
203
  assert (
197
- driver.session_store.get_tracked_message_ids_for_chat(
204
+ await driver.session_store.get_tracked_message_ids_for_chat(
198
205
  scope.platform, scope.chat_id
199
206
  )
200
207
  == []
@@ -204,11 +211,12 @@ async def test_messaging_startup_notice_is_clearable_e2e(tmp_path) -> None:
204
211
  @pytest.mark.asyncio
205
212
  @pytest.mark.parametrize("platform_name", ["discord", "telegram"])
206
213
  async def test_messaging_active_stop_uses_status_only_e2e(
214
+ driver_factory,
207
215
  platform_name: str,
208
216
  tmp_path,
209
217
  monkeypatch,
210
218
  ) -> None:
211
- driver = FakePlatformDriver(platform_name, tmp_path)
219
+ driver = await driver_factory(platform_name, tmp_path)
212
220
  started = asyncio.Event()
213
221
 
214
222
  class GatedActiveSession(FakeCLISession):
@@ -272,9 +280,9 @@ async def test_messaging_active_stop_uses_status_only_e2e(
272
280
 
273
281
  @pytest.mark.asyncio
274
282
  @pytest.mark.parametrize("platform_name", ["discord", "telegram"])
275
- async def test_tree_threading_e2e(platform_name: str, tmp_path) -> None:
283
+ async def test_tree_threading_e2e(driver_factory, platform_name: str, tmp_path) -> None:
276
284
  batches = [default_cli_events("sess_root"), default_cli_events("sess_branch")]
277
- driver = FakePlatformDriver(platform_name, tmp_path, event_batches=batches)
285
+ driver = await driver_factory(platform_name, tmp_path, event_batches=batches)
278
286
 
279
287
  root = await driver.send("root prompt", message_id="root_1")
280
288
  branch = await driver.send(
@@ -294,11 +302,12 @@ async def test_tree_threading_e2e(platform_name: str, tmp_path) -> None:
294
302
  @pytest.mark.asyncio
295
303
  @pytest.mark.parametrize("platform_name", ["discord", "telegram"])
296
304
  async def test_messaging_queued_scoped_cancel_e2e(
305
+ driver_factory,
297
306
  platform_name: str,
298
307
  tmp_path,
299
308
  monkeypatch,
300
309
  ) -> None:
301
- driver = FakePlatformDriver(platform_name, tmp_path)
310
+ driver = await driver_factory(platform_name, tmp_path)
302
311
  root_started = asyncio.Event()
303
312
  release_root = asyncio.Event()
304
313
 
@@ -392,27 +401,29 @@ async def test_messaging_queued_scoped_cancel_e2e(
392
401
  edit["message_id"] == cancelled_status_id and "Stopped" in edit["text"]
393
402
  for edit in driver.platform.edits
394
403
  )
395
- driver.session_store.flush_pending_save()
396
- persisted = driver.session_store.load_conversation_snapshot()
404
+ persisted = await driver.session_store.load_conversation_snapshot()
397
405
  root_identity = TreeIdentity(scope=root.scope, root_id=root.message_id)
398
406
  assert persisted.trees[root_identity].nodes["survivor"]["state"] == "completed"
399
407
 
400
408
 
401
409
  @pytest.mark.asyncio
402
- async def test_restart_restore_and_session_persistence_e2e(tmp_path) -> None:
403
- first = FakePlatformDriver("telegram", tmp_path)
410
+ async def test_restart_restore_and_session_persistence_e2e(
411
+ driver_factory, tmp_path
412
+ ) -> None:
413
+ first = await driver_factory("telegram", tmp_path)
404
414
  root = await first.send("persist me", message_id="root_1")
405
- first.session_store.flush_pending_save()
406
415
 
407
- session_file = tmp_path / "telegram-sessions.json"
408
- payload = json.loads(session_file.read_text(encoding="utf-8"))
409
- assert payload["conversation"]["trees"]
410
- assert payload["managed_messages"]
416
+ saved_before = await first.session_store.load_conversation_snapshot()
417
+ assert saved_before.trees
418
+ assert await first.session_store.get_tracked_message_ids_for_chat(
419
+ "telegram", "chat_1"
420
+ )
421
+ await first.close()
411
422
 
412
- restored = FakePlatformDriver("telegram", tmp_path)
423
+ restored = await driver_factory("telegram", tmp_path)
413
424
  restored.platform.continue_message_sequence_after(first.platform)
414
- restored.workflow.restore()
415
- saved = restored.session_store.load_conversation_snapshot()
425
+ await restored.workflow.restore()
426
+ saved = await restored.session_store.load_conversation_snapshot()
416
427
  assert saved.trees
417
428
  identity = TreeIdentity(scope=root.scope, root_id=root.message_id)
418
429
  assert saved.get_tree(identity) is not None
@@ -436,10 +447,11 @@ async def test_restart_restore_and_session_persistence_e2e(tmp_path) -> None:
436
447
  @pytest.mark.asyncio
437
448
  @pytest.mark.parametrize("platform_name", ["discord", "telegram"])
438
449
  async def test_same_message_ids_are_isolated_by_chat_e2e(
450
+ driver_factory,
439
451
  platform_name: str,
440
452
  tmp_path,
441
453
  ) -> None:
442
- driver = FakePlatformDriver(platform_name, tmp_path)
454
+ driver = await driver_factory(platform_name, tmp_path)
443
455
  first = await driver.send("first chat", chat_id="chat_a", message_id="42")
444
456
  second = await driver.send("second chat", chat_id="chat_b", message_id="42")
445
457
 
@@ -462,8 +474,10 @@ async def test_same_message_ids_are_isolated_by_chat_e2e(
462
474
 
463
475
  @pytest.mark.asyncio
464
476
  @pytest.mark.parametrize("platform_name", ["discord", "telegram"])
465
- async def test_voice_platform_fake_e2e(platform_name: str, tmp_path) -> None:
466
- driver = FakePlatformDriver(platform_name, tmp_path)
477
+ async def test_voice_platform_fake_e2e(
478
+ driver_factory, platform_name: str, tmp_path
479
+ ) -> None:
480
+ driver = await driver_factory(platform_name, tmp_path)
467
481
  driver.platform.seed_pending_voice("chat_1", "voice_msg_1", "voice_status_1")
468
482
 
469
483
  await driver.send("/clear", message_id="clear_voice", reply_to="voice_msg_1")
@@ -482,3 +496,21 @@ async def test_voice_platform_fake_e2e(platform_name: str, tmp_path) -> None:
482
496
  edit["message_id"] == "voice_status_2" and "Stopped" in edit["text"]
483
497
  for edit in driver.platform.edits
484
498
  )
499
+
500
+
501
+ @pytest_asyncio.fixture
502
+ async def driver_factory():
503
+ drivers = []
504
+
505
+ async def create(*args, **kwargs):
506
+ driver = FakePlatformDriver(*args, **kwargs)
507
+ await driver.start()
508
+ drivers.append(driver)
509
+ return driver
510
+
511
+ try:
512
+ yield create
513
+ finally:
514
+ for driver in reversed(drivers):
515
+ if driver.database._started:
516
+ await driver.close()
@@ -123,12 +123,12 @@ function renderStartup() {
123
123
  const message = byId("startupMessage");
124
124
  if (message) {
125
125
  const messaging = startup?.messaging;
126
- const visible = state.activeView === "messaging" && ["starting", "failed"].includes(messaging?.state);
126
+ const visible = state.activeView === "messaging" && (["starting", "failed"].includes(messaging?.state) || Boolean(messaging?.warning));
127
127
  message.hidden = !visible;
128
128
  message.classList.toggle("startup-spinner", visible && messaging.state === "starting");
129
129
  message.classList.toggle("error", messaging?.state === "failed");
130
- message.textContent = messaging?.state === "failed" ? messaging.message || "Messaging could not start." : "";
131
- message.setAttribute("aria-label", "Messaging is starting");
130
+ message.textContent = messaging?.state === "failed" ? messaging.message || "Messaging could not start." : messaging?.warning || "";
131
+ message.setAttribute("aria-label", messaging?.state === "starting" ? "Messaging is starting" : "Messaging status");
132
132
  }
133
133
  if (!startup) return;
134
134
  document.querySelectorAll("[data-startup-provider]").forEach((button) => {
@@ -76,7 +76,7 @@ class MessagingCommandContext(Protocol):
76
76
  """Clear one chat and return every tracked platform message ID."""
77
77
  ...
78
78
 
79
- def forget_tracked_message_ids(
79
+ async def forget_tracked_message_ids(
80
80
  self,
81
81
  platform: str,
82
82
  chat_id: str,
@@ -85,7 +85,7 @@ class MessagingCommandContext(Protocol):
85
85
  """Forget platform message IDs removed from the managed conversation."""
86
86
  ...
87
87
 
88
- def record_outgoing_message(
88
+ async def record_outgoing_message(
89
89
  self,
90
90
  platform: str,
91
91
  chat_id: str,
@@ -21,7 +21,7 @@ async def _send_stop_feedback(
21
21
  fire_and_forget=False,
22
22
  message_thread_id=incoming.message_thread_id,
23
23
  )
24
- handler.record_outgoing_message(
24
+ await handler.record_outgoing_message(
25
25
  incoming.platform, incoming.chat_id, msg_id, "command"
26
26
  )
27
27
 
@@ -85,7 +85,7 @@ async def handle_stats_command(
85
85
  fire_and_forget=False,
86
86
  message_thread_id=incoming.message_thread_id,
87
87
  )
88
- handler.record_outgoing_message(
88
+ await handler.record_outgoing_message(
89
89
  incoming.platform, incoming.chat_id, msg_id, "command"
90
90
  )
91
91
 
@@ -157,7 +157,7 @@ async def handle_clear_command(
157
157
  fire_and_forget=False,
158
158
  message_thread_id=incoming.message_thread_id,
159
159
  )
160
- handler.record_outgoing_message(
160
+ await handler.record_outgoing_message(
161
161
  incoming.platform, incoming.chat_id, msg_id, "command"
162
162
  )
163
163
  return
@@ -166,7 +166,7 @@ async def handle_clear_command(
166
166
  if incoming.message_id is not None:
167
167
  delete_message_ids.add(str(incoming.message_id))
168
168
  await _delete_message_ids(handler, incoming.chat_id, delete_message_ids)
169
- handler.forget_tracked_message_ids(
169
+ await handler.forget_tracked_message_ids(
170
170
  incoming.platform,
171
171
  incoming.chat_id,
172
172
  delete_message_ids,
@@ -16,9 +16,13 @@ from .managed_protocols import ManagedClaudeSessionManagerProtocol
16
16
  from .node_event_pipeline import handle_session_info_event, process_parsed_cli_event
17
17
  from .platforms.ports import OutboundMessenger
18
18
  from .safe_diagnostics import format_exception_for_log
19
- from .session import SessionStore
20
19
  from .transcript import RenderCtx, TranscriptBuffer
21
- from .trees import CancellationReason, NodeClaim, TreeQueueManager, TreeSnapshot
20
+ from .trees import (
21
+ CancellationReason,
22
+ MessagingStorageError,
23
+ NodeClaim,
24
+ TreeQueueManager,
25
+ )
22
26
  from .ui_updates import ThrottledTranscriptEditor
23
27
 
24
28
 
@@ -31,7 +35,6 @@ class MessagingNodeRunner:
31
35
  platform_name: str,
32
36
  outbound: OutboundMessenger,
33
37
  cli_manager: ManagedClaudeSessionManagerProtocol,
34
- session_store: SessionStore,
35
38
  get_tree_queue: Callable[[], TreeQueueManager],
36
39
  format_status: Callable[[str, str, str | None], str],
37
40
  get_parse_mode: Callable[[], str | None],
@@ -45,7 +48,6 @@ class MessagingNodeRunner:
45
48
  self.platform_name = platform_name
46
49
  self.outbound = outbound
47
50
  self.cli_manager = cli_manager
48
- self.session_store = session_store
49
51
  self._get_tree_queue = get_tree_queue
50
52
  self._format_status = format_status
51
53
  self._get_parse_mode = get_parse_mode
@@ -66,23 +68,15 @@ class MessagingNodeRunner:
66
68
  )
67
69
  return transcript, self._get_render_ctx()
68
70
 
69
- def _save_snapshot(self, snapshot: TreeSnapshot | None) -> None:
70
- """Persist a snapshot returned by the active aggregate manager."""
71
- if snapshot is None:
72
- return
73
- self.session_store.save_tree_snapshot(snapshot)
74
-
75
71
  async def _record_session(self, claim: NodeClaim, session_id: str) -> None:
76
- snapshot = await self._get_tree_queue().record_session(claim, session_id)
77
- self._save_snapshot(snapshot)
72
+ await self._get_tree_queue().record_session(claim, session_id)
78
73
 
79
74
  async def _complete_claim(
80
75
  self,
81
76
  claim: NodeClaim,
82
77
  session_id: str | None,
83
78
  ) -> None:
84
- snapshot = await self._get_tree_queue().complete_claim(claim, session_id)
85
- self._save_snapshot(snapshot)
79
+ await self._get_tree_queue().complete_claim(claim, session_id)
86
80
 
87
81
  async def _fail_claim(
88
82
  self,
@@ -95,7 +89,6 @@ class MessagingNodeRunner:
95
89
  claim,
96
90
  propagate=propagate,
97
91
  )
98
- self._save_snapshot(result.snapshot)
99
92
  if child_status_text is None:
100
93
  return
101
94
  for child in result.affected:
@@ -358,6 +351,9 @@ class MessagingNodeRunner:
358
351
  claim,
359
352
  propagate=False,
360
353
  )
354
+ except MessagingStorageError:
355
+ # The processor owns interruption reporting, including queued turns.
356
+ raise
361
357
  except Exception as e:
362
358
  trace_event(
363
359
  stage="claude_cli",
@@ -1,8 +1,10 @@
1
1
  """Internal messaging tree package facade."""
2
2
 
3
+ from .graph import normalize_tree_snapshot
3
4
  from .identity import TreeIdentity
4
5
  from .manager import TreeQueueManager
5
6
  from .node import MessageReferenceKind, MessageState
7
+ from .ports import MessagingStorageError, MessagingStore
6
8
  from .snapshot import ConversationSnapshot, TreeSnapshot
7
9
  from .transitions import (
8
10
  AdmissionRejection,
@@ -29,6 +31,8 @@ __all__ = [
29
31
  "MessageReferenceKind",
30
32
  "MessageState",
31
33
  "MessageSubtreeRemovalResult",
34
+ "MessagingStorageError",
35
+ "MessagingStore",
32
36
  "NodeClaim",
33
37
  "NodeUiTarget",
34
38
  "NodeView",
@@ -38,4 +42,5 @@ __all__ = [
38
42
  "TreeIdentity",
39
43
  "TreeQueueManager",
40
44
  "TreeSnapshot",
45
+ "normalize_tree_snapshot",
41
46
  ]
@@ -248,3 +248,17 @@ class MessageTreeGraph:
248
248
  if set(graph.get_descendants(graph.root_id)) != set(graph._nodes):
249
249
  raise ValueError("Tree snapshot contains a disconnected branch")
250
250
  return graph
251
+
252
+
253
+ def normalize_tree_snapshot(snapshot: TreeSnapshot) -> TreeSnapshot:
254
+ """Validate domain links and return detached records in parent-first order."""
255
+ graph = MessageTreeGraph.from_snapshot(snapshot)
256
+ normalized = graph.snapshot()
257
+ return TreeSnapshot(
258
+ normalized.scope,
259
+ normalized.root_id,
260
+ {
261
+ node_id: normalized.nodes[node_id]
262
+ for node_id in graph.get_descendants(graph.root_id)
263
+ },
264
+ )