free-claude-code 6.3.2__tar.gz → 6.3.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (889) hide show
  1. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/PKG-INFO +1 -1
  2. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_code_sessions.py +7 -1
  3. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_codex_modes_product_live.py +6 -1
  4. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/paths.py +8 -2
  5. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/bootstrap.py +7 -2
  6. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/code_sessions_sqlite.py +29 -126
  7. free_claude_code-6.3.3/src/free_claude_code/runtime/sqlite_database.py +163 -0
  8. free_claude_code-6.3.3/src/free_claude_code/runtime/sqlite_migrations/__init__.py +17 -0
  9. free_claude_code-6.3.3/src/free_claude_code/runtime/sqlite_migrations/v0001_code_schema.py +97 -0
  10. free_claude_code-6.3.3/src/free_claude_code/runtime/sqlite_migrations/v0002_code_permissions.py +16 -0
  11. free_claude_code-6.3.3/src/free_claude_code/runtime/sqlite_migrations/v0003_code_context_usage.py +10 -0
  12. free_claude_code-6.3.3/tests/contracts/test_codex_smoke_storage.py +58 -0
  13. free_claude_code-6.3.3/tests/runtime/fixtures/code_schema_v0.sql +39 -0
  14. free_claude_code-6.3.3/tests/runtime/test_sqlite_database.py +472 -0
  15. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.gitattributes +0 -0
  16. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  17. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  18. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  19. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/ISSUE_TEMPLATE/installation-problem.yml +0 -0
  20. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/actions/ci-environment/action.yml +0 -0
  21. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/dependabot.yml +0 -0
  22. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/workflows/post-merge.yml +0 -0
  23. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/workflows/tests.yml +0 -0
  24. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/workflows/validate-bug-report-version.yml +0 -0
  25. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/workflows/version-policy.yml +0 -0
  26. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.gitignore +0 -0
  27. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/CONTRIBUTING.md +0 -0
  28. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/LICENSE +0 -0
  29. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/README.md +0 -0
  30. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/admin-messaging.png +0 -0
  31. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/admin-page.png +0 -0
  32. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/browser-code-session.png +0 -0
  33. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/cc-model-picker.png +0 -0
  34. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/codex-model-picker.png +0 -0
  35. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/codex.png +0 -0
  36. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/free-claude-code-wordmark-dark.svg +0 -0
  37. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/free-claude-code-wordmark-light.svg +0 -0
  38. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/how-it-works.mmd +0 -0
  39. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/how-it-works.svg +0 -0
  40. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/package-manager-uv.svg +0 -0
  41. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/pic.png +0 -0
  42. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/conftest.py +0 -0
  43. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/__init__.py +0 -0
  44. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/code_support.py +0 -0
  45. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/conftest.py +0 -0
  46. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/form_support.py +0 -0
  47. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/provider_support.py +0 -0
  48. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_admin_apply.py +0 -0
  49. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_admin_assets.py +0 -0
  50. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_admin_integrations.py +0 -0
  51. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_admin_models.py +0 -0
  52. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_admin_providers.py +0 -0
  53. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_claude_desktop_integration.py +0 -0
  54. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_connected_accounts.py +0 -0
  55. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_custom_providers.py +0 -0
  56. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_integration_notices.py +0 -0
  57. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_jetbrains_acp_integration.py +0 -0
  58. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_progressive_startup.py +0 -0
  59. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_provider_modals.py +0 -0
  60. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_tool_schema_patterns.py +0 -0
  61. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/thread_diagnostics.py +0 -0
  62. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/pyproject.toml +0 -0
  63. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/check_version_policy.py +0 -0
  64. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/ci.ps1 +0 -0
  65. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/ci.sh +0 -0
  66. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/install-muse.ps1 +0 -0
  67. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/install.ps1 +0 -0
  68. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/install.sh +0 -0
  69. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/publish_release.py +0 -0
  70. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/uninstall-muse.ps1 +0 -0
  71. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/uninstall.ps1 +0 -0
  72. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/uninstall.sh +0 -0
  73. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/update/fcc-update +0 -0
  74. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/update/fcc-update.cmd +0 -0
  75. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/validate_release.py +0 -0
  76. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/README.md +0 -0
  77. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/__init__.py +0 -0
  78. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/assets/vision-fcc.png +0 -0
  79. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/capabilities.py +0 -0
  80. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/conftest.py +0 -0
  81. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/features.py +0 -0
  82. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/AGENTS.md +0 -0
  83. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/_pty_runner.py +0 -0
  84. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/conftest.py +0 -0
  85. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/fixtures/.gitattributes +0 -0
  86. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/fixtures/README.md +0 -0
  87. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/fixtures/rtk-LICENSE +0 -0
  88. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/fixtures/rtk-opencode-v1.ts +0 -0
  89. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/test_installers.py +0 -0
  90. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/test_muse_windows_lifecycle.py +0 -0
  91. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/test_powershell_cache.py +0 -0
  92. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/test_uninstallers.py +0 -0
  93. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/__init__.py +0 -0
  94. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/child_process.py +0 -0
  95. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/claude_cli_matrix.py +0 -0
  96. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/config.py +0 -0
  97. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/e2e.py +0 -0
  98. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/http.py +0 -0
  99. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/local_providers.py +0 -0
  100. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/outcomes.py +0 -0
  101. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/report.py +0 -0
  102. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/report_summary.py +0 -0
  103. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/server.py +0 -0
  104. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/skips.py +0 -0
  105. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/__init__.py +0 -0
  106. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_api_prereq_live.py +0 -0
  107. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_auth_prereq_live.py +0 -0
  108. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_cli_prereq_live.py +0 -0
  109. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_client_shapes_prereq_live.py +0 -0
  110. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_local_provider_endpoints_prereq_live.py +0 -0
  111. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_messaging_prereq_live.py +0 -0
  112. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_provider_prereq_live.py +0 -0
  113. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_tools_prereq_live.py +0 -0
  114. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_voice_prereq_live.py +0 -0
  115. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/__init__.py +0 -0
  116. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_api_product_live.py +0 -0
  117. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_auth_product_live.py +0 -0
  118. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_cli_package_product_live.py +0 -0
  119. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_client_product_live.py +0 -0
  120. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_config_extensibility_product_live.py +0 -0
  121. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_live_platform_product_live.py +0 -0
  122. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_local_provider_product_live.py +0 -0
  123. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_messaging_product_live.py +0 -0
  124. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_model_fallback_product_live.py +0 -0
  125. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_nvidia_nim_cli_product_live.py +0 -0
  126. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_nvidia_nim_vision_product_live.py +0 -0
  127. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_openrouter_free_cli_product_live.py +0 -0
  128. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_provider_product_live.py +0 -0
  129. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_runtime_ownership_product_live.py +0 -0
  130. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_voice_product_live.py +0 -0
  131. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/__init__.py +0 -0
  132. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/__init__.py +0 -0
  133. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_cache.py +0 -0
  134. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_routes.py +0 -0
  135. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_security.py +0 -0
  136. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/admin.css +0 -0
  137. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/admin.js +0 -0
  138. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/code_sessions.css +0 -0
  139. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/code_sessions.js +0 -0
  140. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/form_controls.js +0 -0
  141. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/index.html +0 -0
  142. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/model_combobox.js +0 -0
  143. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/LICENSE-llamacpp.txt +0 -0
  144. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/LICENSE-lobe-icons.txt +0 -0
  145. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/SOURCES.md +0 -0
  146. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/agnesai.svg +0 -0
  147. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/azure-color.svg +0 -0
  148. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/bedrock-color.svg +0 -0
  149. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/cerebras-color.svg +0 -0
  150. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/cheaperinference.svg +0 -0
  151. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/chutes.png +0 -0
  152. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/cline.svg +0 -0
  153. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/cloudflare-color.svg +0 -0
  154. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/cohere-color.svg +0 -0
  155. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/deepinfra-color.svg +0 -0
  156. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/deepseek-color.svg +0 -0
  157. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/experiential.svg +0 -0
  158. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/featherless-color.svg +0 -0
  159. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/fireworks-color.svg +0 -0
  160. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/gemini-color.svg +0 -0
  161. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/githubcopilot.svg +0 -0
  162. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/groq.svg +0 -0
  163. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/huggingface-color.svg +0 -0
  164. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/kilocode.svg +0 -0
  165. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/kimi-color.svg +0 -0
  166. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/lightning.png +0 -0
  167. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/llamacpp.svg +0 -0
  168. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/llm7.png +0 -0
  169. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/lmstudio.svg +0 -0
  170. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/minimax-color.svg +0 -0
  171. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/mistral-color.svg +0 -0
  172. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/nararoute.png +0 -0
  173. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/nebius.svg +0 -0
  174. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/novita-color.svg +0 -0
  175. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/nvidia-color.svg +0 -0
  176. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/ollama.svg +0 -0
  177. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/openai.svg +0 -0
  178. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/opencode.svg +0 -0
  179. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/openrouter.svg +0 -0
  180. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/poolside-color.svg +0 -0
  181. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/qwen-color.svg +0 -0
  182. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/sambanova-color.svg +0 -0
  183. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/scaleway.svg +0 -0
  184. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/siliconcloud-color.svg +0 -0
  185. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/together-color.svg +0 -0
  186. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/tokenrouter.png +0 -0
  187. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/vercel.svg +0 -0
  188. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/vertexai-color.svg +0 -0
  189. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/wafer.png +0 -0
  190. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/wandb.png +0 -0
  191. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/xai.svg +0 -0
  192. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/zai.svg +0 -0
  193. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/zenmux.svg +0 -0
  194. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/session_layout.css +0 -0
  195. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/session_ui.js +0 -0
  196. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/app.py +0 -0
  197. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/code_sessions_routes.py +0 -0
  198. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/command_utils.py +0 -0
  199. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/dependencies.py +0 -0
  200. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/detection.py +0 -0
  201. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/handlers/__init__.py +0 -0
  202. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/handlers/classifier_response.py +0 -0
  203. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/handlers/messages.py +0 -0
  204. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/handlers/responses.py +0 -0
  205. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/handlers/token_count.py +0 -0
  206. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/markdown.py +0 -0
  207. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/model_catalog.py +0 -0
  208. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/optimization_handlers.py +0 -0
  209. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/ports.py +0 -0
  210. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/request_errors.py +0 -0
  211. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/request_ids.py +0 -0
  212. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/request_lifetime.py +0 -0
  213. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/response_streams.py +0 -0
  214. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/routes.py +0 -0
  215. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/validation_log.py +0 -0
  216. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/__init__.py +0 -0
  217. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/code_sessions/__init__.py +0 -0
  218. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/code_sessions/models.py +0 -0
  219. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/code_sessions/ports.py +0 -0
  220. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/code_sessions/service.py +0 -0
  221. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/code_sessions/state.py +0 -0
  222. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/connected_accounts.py +0 -0
  223. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/errors.py +0 -0
  224. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/execution.py +0 -0
  225. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/model_catalog.py +0 -0
  226. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/model_metadata.py +0 -0
  227. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/ports.py +0 -0
  228. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/readiness.py +0 -0
  229. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/reasoning.py +0 -0
  230. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/routing.py +0 -0
  231. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/session_events.py +0 -0
  232. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/web_tools/__init__.py +0 -0
  233. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/web_tools/ports.py +0 -0
  234. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/web_tools/request.py +0 -0
  235. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/web_tools/service.py +0 -0
  236. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/assets/app-icon.icns +0 -0
  237. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/assets/app-icon.ico +0 -0
  238. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/assets/app-icon.png +0 -0
  239. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/assets/app-icon.svg +0 -0
  240. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/__init__.py +0 -0
  241. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/clipboard.py +0 -0
  242. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/commands.py +0 -0
  243. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/desktop.py +0 -0
  244. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/desktop_assets.py +0 -0
  245. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/desktop_entrypoint.py +0 -0
  246. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/desktop_tray.py +0 -0
  247. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/doctor.py +0 -0
  248. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/entrypoints.py +0 -0
  249. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/__init__.py +0 -0
  250. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/aider.py +0 -0
  251. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/aider_config.py +0 -0
  252. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/catalog_http.py +0 -0
  253. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/claude.py +0 -0
  254. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/cline.py +0 -0
  255. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/cline_config.py +0 -0
  256. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/codex.py +0 -0
  257. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/common.py +0 -0
  258. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/dsh.py +0 -0
  259. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/dsh_config.py +0 -0
  260. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/grok.py +0 -0
  261. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/hermes.py +0 -0
  262. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/hermes_config.py +0 -0
  263. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/muse.py +0 -0
  264. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/opencode.py +0 -0
  265. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/opencode_config.py +0 -0
  266. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/pi.py +0 -0
  267. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/pi_extension.ts +0 -0
  268. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/runner.py +0 -0
  269. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/local_http.py +0 -0
  270. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/managed/__init__.py +0 -0
  271. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/managed/claude.py +0 -0
  272. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/managed/diagnostics.py +0 -0
  273. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/managed/manager.py +0 -0
  274. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/managed/session.py +0 -0
  275. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/process_registry.py +0 -0
  276. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/server_socket.py +0 -0
  277. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/uvicorn_server.py +0 -0
  278. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/__init__.py +0 -0
  279. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/__init__.py +0 -0
  280. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/custom_providers.py +0 -0
  281. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/manifest.py +0 -0
  282. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/persistence.py +0 -0
  283. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/provider_manifest.py +0 -0
  284. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/specs.py +0 -0
  285. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/state.py +0 -0
  286. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/status.py +0 -0
  287. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/validation.py +0 -0
  288. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/values.py +0 -0
  289. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/constants.py +0 -0
  290. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/custom_providers.py +0 -0
  291. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/env_files.py +0 -0
  292. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/env_migrations.py +0 -0
  293. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/loader.py +0 -0
  294. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/logging_config.py +0 -0
  295. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/model_refs.py +0 -0
  296. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/nim.py +0 -0
  297. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/provider_catalog.py +0 -0
  298. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/provider_proxies.py +0 -0
  299. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/reasoning.py +0 -0
  300. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/server_urls.py +0 -0
  301. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/settings.py +0 -0
  302. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/__init__.py +0 -0
  303. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/__init__.py +0 -0
  304. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/content.py +0 -0
  305. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/conversion.py +0 -0
  306. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/errors.py +0 -0
  307. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/image_sources.py +0 -0
  308. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/models.py +0 -0
  309. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/native.py +0 -0
  310. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/native_stream.py +0 -0
  311. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/request_serialization.py +0 -0
  312. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/request_snapshot.py +0 -0
  313. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/server_tool_sse.py +0 -0
  314. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/server_tool_types.py +0 -0
  315. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/sse_aggregation.py +0 -0
  316. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/stream_contracts.py +0 -0
  317. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/streaming/__init__.py +0 -0
  318. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/streaming/decoder.py +0 -0
  319. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/streaming/emitter.py +0 -0
  320. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/streaming/ledger.py +0 -0
  321. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/streaming/recovery.py +0 -0
  322. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/thinking.py +0 -0
  323. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/tokens.py +0 -0
  324. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/tool_results.py +0 -0
  325. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/tool_schema.py +0 -0
  326. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/tools.py +0 -0
  327. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/usage.py +0 -0
  328. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/utils.py +0 -0
  329. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/async_iterators.py +0 -0
  330. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/async_tasks.py +0 -0
  331. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/data/README.md +0 -0
  332. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/data/TIKTOKEN-LICENSE +0 -0
  333. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/data/cl100k_base.tiktoken +0 -0
  334. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/diagnostics.py +0 -0
  335. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/failures.py +0 -0
  336. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/gateway_model_ids.py +0 -0
  337. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/history_replay.py +0 -0
  338. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/interprocess_lock.py +0 -0
  339. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/json_types.py +0 -0
  340. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/model_capabilities.py +0 -0
  341. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_chat.py +0 -0
  342. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/__init__.py +0 -0
  343. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/chat_request.py +0 -0
  344. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/errors.py +0 -0
  345. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/events.py +0 -0
  346. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/ids.py +0 -0
  347. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/items.py +0 -0
  348. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/messages_request.py +0 -0
  349. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/messages_stream.py +0 -0
  350. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/models.py +0 -0
  351. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/native.py +0 -0
  352. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/provider_input.py +0 -0
  353. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/provider_stream.py +0 -0
  354. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/reasoning.py +0 -0
  355. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/streaming/__init__.py +0 -0
  356. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/streaming/blocks.py +0 -0
  357. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/streaming/completion.py +0 -0
  358. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/streaming/error_mapping.py +0 -0
  359. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/streaming/event_builders.py +0 -0
  360. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/streaming/ledger.py +0 -0
  361. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/tokens.py +0 -0
  362. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/tool_adaptation.py +0 -0
  363. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/tool_search.py +0 -0
  364. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/tools.py +0 -0
  365. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_tool_names.py +0 -0
  366. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/rate_limit.py +0 -0
  367. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/reasoning.py +0 -0
  368. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/token_estimation.py +0 -0
  369. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/tool_schema_patterns.py +0 -0
  370. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/trace.py +0 -0
  371. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/version.py +0 -0
  372. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/web_tools.py +0 -0
  373. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/windows_dpi.py +0 -0
  374. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/__init__.py +0 -0
  375. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/claude.py +0 -0
  376. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/claude_desktop_integration.py +0 -0
  377. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/claude_integration.py +0 -0
  378. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/codex.py +0 -0
  379. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/codex_integration.py +0 -0
  380. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/codex_model_catalog.py +0 -0
  381. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/config_file.py +0 -0
  382. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/environment.py +0 -0
  383. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/jetbrains_acp_integration.py +0 -0
  384. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/launch.py +0 -0
  385. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/resources.py +0 -0
  386. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/__init__.py +0 -0
  387. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/cli_event_constants.py +0 -0
  388. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/command_context.py +0 -0
  389. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/command_dispatcher.py +0 -0
  390. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/commands.py +0 -0
  391. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/event_parser.py +0 -0
  392. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/limiter.py +0 -0
  393. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/managed_protocols.py +0 -0
  394. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/models.py +0 -0
  395. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/node_event_pipeline.py +0 -0
  396. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/node_runner.py +0 -0
  397. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/__init__.py +0 -0
  398. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/discord.py +0 -0
  399. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/discord_inbound.py +0 -0
  400. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/discord_io.py +0 -0
  401. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/factory.py +0 -0
  402. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/outbox.py +0 -0
  403. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/ports.py +0 -0
  404. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/telegram.py +0 -0
  405. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/telegram_inbound.py +0 -0
  406. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/telegram_io.py +0 -0
  407. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/voice_flow.py +0 -0
  408. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/rendering/__init__.py +0 -0
  409. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/rendering/discord_markdown.py +0 -0
  410. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/rendering/markdown_tables.py +0 -0
  411. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/rendering/profiles.py +0 -0
  412. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/rendering/telegram_markdown.py +0 -0
  413. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/safe_diagnostics.py +0 -0
  414. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/session/__init__.py +0 -0
  415. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/session/managed_message_log.py +0 -0
  416. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/session/persistence.py +0 -0
  417. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/session/store.py +0 -0
  418. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/transcript/__init__.py +0 -0
  419. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/transcript/buffer.py +0 -0
  420. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/transcript/context.py +0 -0
  421. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/transcript/renderer.py +0 -0
  422. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/transcript/segments.py +0 -0
  423. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/transcript/subagents.py +0 -0
  424. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/transcription.py +0 -0
  425. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/__init__.py +0 -0
  426. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/graph.py +0 -0
  427. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/identity.py +0 -0
  428. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/manager.py +0 -0
  429. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/node.py +0 -0
  430. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/processor.py +0 -0
  431. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/queue.py +0 -0
  432. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/repository.py +0 -0
  433. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/runtime.py +0 -0
  434. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/snapshot.py +0 -0
  435. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/transitions.py +0 -0
  436. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/turn_intake.py +0 -0
  437. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/ui_updates.py +0 -0
  438. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/voice.py +0 -0
  439. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/workflow.py +0 -0
  440. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/__init__.py +0 -0
  441. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/admission.py +0 -0
  442. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/anthropic_messages/__init__.py +0 -0
  443. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/anthropic_messages/request_policy.py +0 -0
  444. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/anthropic_messages/transport.py +0 -0
  445. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/base.py +0 -0
  446. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/cloudflare/__init__.py +0 -0
  447. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/cloudflare/client.py +0 -0
  448. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/credential_validation.py +0 -0
  449. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/custom.py +0 -0
  450. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/deepseek/__init__.py +0 -0
  451. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/deepseek/client.py +0 -0
  452. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/deepseek/compat.py +0 -0
  453. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/endpoint.py +0 -0
  454. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/endpoint_types.py +0 -0
  455. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/failure_policy.py +0 -0
  456. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/gemini/__init__.py +0 -0
  457. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/gemini/client.py +0 -0
  458. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/__init__.py +0 -0
  459. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/auth.py +0 -0
  460. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/broker.py +0 -0
  461. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/lifecycle.py +0 -0
  462. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/login.py +0 -0
  463. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/native_cli.py +0 -0
  464. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/provider.py +0 -0
  465. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/request_policy.py +0 -0
  466. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/responses_events.py +0 -0
  467. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/sdk.py +0 -0
  468. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/types.py +0 -0
  469. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/google_openai/__init__.py +0 -0
  470. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/google_openai/provider.py +0 -0
  471. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/google_openai/reasoning.py +0 -0
  472. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/google_openai/thought_signatures.py +0 -0
  473. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/groq/__init__.py +0 -0
  474. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/groq/client.py +0 -0
  475. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/groq/tpm.py +0 -0
  476. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/history_replay.py +0 -0
  477. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/http.py +0 -0
  478. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/kilo/__init__.py +0 -0
  479. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/kilo/client.py +0 -0
  480. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/kilo/models.py +0 -0
  481. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/lmstudio/__init__.py +0 -0
  482. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/lmstudio/client.py +0 -0
  483. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/mistral/__init__.py +0 -0
  484. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/mistral/client.py +0 -0
  485. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/mistral/reasoning.py +0 -0
  486. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/model_listing.py +0 -0
  487. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/nvidia_nim/__init__.py +0 -0
  488. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/nvidia_nim/client.py +0 -0
  489. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/nvidia_nim/native_tool_stream.py +0 -0
  490. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/nvidia_nim/request_options.py +0 -0
  491. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/nvidia_nim/retry.py +0 -0
  492. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/nvidia_nim/tool_schema.py +0 -0
  493. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/nvidia_nim/voice.py +0 -0
  494. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/open_router/__init__.py +0 -0
  495. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/open_router/client.py +0 -0
  496. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_api/__init__.py +0 -0
  497. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_api/provider.py +0 -0
  498. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/__init__.py +0 -0
  499. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/base_url.py +0 -0
  500. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/behavior.py +0 -0
  501. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/client.py +0 -0
  502. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/extra_body.py +0 -0
  503. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/output_cap.py +0 -0
  504. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/profiles.py +0 -0
  505. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/provider.py +0 -0
  506. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/reasoning.py +0 -0
  507. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/reasoning_details.py +0 -0
  508. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/request_policy.py +0 -0
  509. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/stream_output.py +0 -0
  510. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/tool_calls.py +0 -0
  511. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/transport.py +0 -0
  512. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/usage.py +0 -0
  513. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_client.py +0 -0
  514. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_codex/__init__.py +0 -0
  515. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_codex/auth.py +0 -0
  516. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_codex/endpoint.py +0 -0
  517. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_codex/login.py +0 -0
  518. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_codex/provider.py +0 -0
  519. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_responses/__init__.py +0 -0
  520. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_responses/presentation.py +0 -0
  521. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_responses/transport.py +0 -0
  522. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_stream.py +0 -0
  523. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/opencode/__init__.py +0 -0
  524. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/opencode/catalog.py +0 -0
  525. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/opencode/provider.py +0 -0
  526. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/reasoning_compatibility.py +0 -0
  527. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/request_recovery.py +0 -0
  528. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/runtime/__init__.py +0 -0
  529. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/runtime/config.py +0 -0
  530. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/runtime/discovery.py +0 -0
  531. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/runtime/factory.py +0 -0
  532. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/runtime/model_cache.py +0 -0
  533. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/runtime/runtime.py +0 -0
  534. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/stream_recovery.py +0 -0
  535. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/vertex/__init__.py +0 -0
  536. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/vertex/auth.py +0 -0
  537. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/vertex/client.py +0 -0
  538. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/vertex/endpoint.py +0 -0
  539. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/vertex/models.py +0 -0
  540. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/__init__.py +0 -0
  541. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/application.py +0 -0
  542. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/asgi.py +0 -0
  543. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/codex_app_server.py +0 -0
  544. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/codex_catalog.py +0 -0
  545. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/codex_protocol.py +0 -0
  546. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/configuration.py +0 -0
  547. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/diagnostics.py +0 -0
  548. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/folder_picker.py +0 -0
  549. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/native_folder_dialog.py +0 -0
  550. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/provider_manager.py +0 -0
  551. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/retired_chat.py +0 -0
  552. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/web_tools/__init__.py +0 -0
  553. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/web_tools/client.py +0 -0
  554. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/web_tools/constants.py +0 -0
  555. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/web_tools/egress.py +0 -0
  556. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/web_tools/parsers.py +0 -0
  557. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/__init__.py +0 -0
  558. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/model_fallback_support.py +0 -0
  559. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/support.py +0 -0
  560. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_admin.py +0 -0
  561. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_admin_configuration_io.py +0 -0
  562. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_api.py +0 -0
  563. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_api_handlers.py +0 -0
  564. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_app_lifespan_and_errors.py +0 -0
  565. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_app_version.py +0 -0
  566. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_auth.py +0 -0
  567. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_classifier_provider_compatibility.py +0 -0
  568. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_classifier_response.py +0 -0
  569. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_claude_desktop_integration.py +0 -0
  570. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_code_sessions_routes.py +0 -0
  571. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_codex_integration_routes.py +0 -0
  572. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_dependencies.py +0 -0
  573. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_detection.py +0 -0
  574. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_execution_failure_contract.py +0 -0
  575. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_groq_token_limits.py +0 -0
  576. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_jetbrains_acp_integration.py +0 -0
  577. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_managed_proxy_token.py +0 -0
  578. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_markdown.py +0 -0
  579. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_model_fallback.py +0 -0
  580. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_model_listing.py +0 -0
  581. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_openai_codex_compatibility.py +0 -0
  582. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_openai_responses.py +0 -0
  583. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_opencode_session_headers.py +0 -0
  584. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_openrouter_image_errors.py +0 -0
  585. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_optimization_handlers.py +0 -0
  586. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_ordinary_error_phases.py +0 -0
  587. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_request_ids.py +0 -0
  588. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_request_lifetime.py +0 -0
  589. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_request_utils.py +0 -0
  590. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_request_utils_filepaths_and_suggestions.py +0 -0
  591. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_response_streams.py +0 -0
  592. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_routes_optimizations.py +0 -0
  593. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_runtime_safe_logging.py +0 -0
  594. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_safe_logging.py +0 -0
  595. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_validation_log.py +0 -0
  596. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_vscode_integration.py +0 -0
  597. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_web_server_tools.py +0 -0
  598. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_code_sessions.py +0 -0
  599. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_code_sessions_state.py +0 -0
  600. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_connected_accounts.py +0 -0
  601. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_execution.py +0 -0
  602. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_model_catalog.py +0 -0
  603. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_model_metadata.py +0 -0
  604. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_reasoning.py +0 -0
  605. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_request_conversion.py +0 -0
  606. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_routing.py +0 -0
  607. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_session_events.py +0 -0
  608. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_web_tools.py +0 -0
  609. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/conftest.py +0 -0
  610. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_aider_config.py +0 -0
  611. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_aider_launcher.py +0 -0
  612. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_catalog_http.py +0 -0
  613. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_claude_launcher.py +0 -0
  614. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_cli.py +0 -0
  615. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_cli_manager_edge_cases.py +0 -0
  616. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_cli_ownership.py +0 -0
  617. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_cline_launcher.py +0 -0
  618. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_codex_launcher.py +0 -0
  619. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_codex_model_catalog.py +0 -0
  620. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_config_restart_lifecycle.py +0 -0
  621. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_desktop.py +0 -0
  622. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_desktop_assets.py +0 -0
  623. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_doctor.py +0 -0
  624. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_dsh_config.py +0 -0
  625. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_dsh_launcher.py +0 -0
  626. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_entrypoints.py +0 -0
  627. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_grok_launcher.py +0 -0
  628. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_hermes_config.py +0 -0
  629. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_hermes_launcher.py +0 -0
  630. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_launcher_checks.py +0 -0
  631. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_launcher_environment.py +0 -0
  632. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_launcher_resources.py +0 -0
  633. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_launcher_workflow.py +0 -0
  634. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_local_http.py +0 -0
  635. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_managed_claude.py +0 -0
  636. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_managed_session_shutdown.py +0 -0
  637. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_model_catalog_decoder.py +0 -0
  638. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_muse_launcher.py +0 -0
  639. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_opencode_launcher.py +0 -0
  640. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_pi_extension.py +0 -0
  641. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_pi_launcher.py +0 -0
  642. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_process_registry.py +0 -0
  643. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_progressive_launch.py +0 -0
  644. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_server_shutdown.py +0 -0
  645. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_update_wrapper.py +0 -0
  646. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/code_sessions_support.py +0 -0
  647. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_admin_credential_changes.py +0 -0
  648. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_admin_status.py +0 -0
  649. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_config.py +0 -0
  650. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_custom_provider_mutations.py +0 -0
  651. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_custom_providers.py +0 -0
  652. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_env_migrations.py +0 -0
  653. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_fixed_cloud_endpoints.py +0 -0
  654. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_logging_config.py +0 -0
  655. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_provider_catalog.py +0 -0
  656. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/conftest.py +0 -0
  657. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_admin_provider_manifest.py +0 -0
  658. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_capability_map.py +0 -0
  659. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_feature_manifest.py +0 -0
  660. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_import_boundaries.py +0 -0
  661. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_issue_form_version_validation.py +0 -0
  662. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_issue_forms.py +0 -0
  663. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_local_provider_smoke.py +0 -0
  664. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_nvidia_nim_cli_matrix.py +0 -0
  665. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_offline_startup.py +0 -0
  666. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_packaging_contracts.py +0 -0
  667. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_protocol_matrix.py +0 -0
  668. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_provider_catalog_order.py +0 -0
  669. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_smoke_child_process.py +0 -0
  670. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_smoke_config.py +0 -0
  671. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_smoke_tiers.py +0 -0
  672. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_startup_import_boundaries.py +0 -0
  673. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_stream_contracts.py +0 -0
  674. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_uv_policy.py +0 -0
  675. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_errors.py +0 -0
  676. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_image_sources.py +0 -0
  677. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_models.py +0 -0
  678. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_native_messages.py +0 -0
  679. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_native_messages_stream.py +0 -0
  680. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_native_sse_framing.py +0 -0
  681. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_openai_tool_names.py +0 -0
  682. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_request_serialization.py +0 -0
  683. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_response_models.py +0 -0
  684. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_server_tool_sse.py +0 -0
  685. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_sse_decoder.py +0 -0
  686. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_stream_ledger.py +0 -0
  687. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_stream_repair.py +0 -0
  688. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_text_tools.py +0 -0
  689. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_tool_results.py +0 -0
  690. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_usage.py +0 -0
  691. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_chat_request.py +0 -0
  692. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_client_tool_discovery.py +0 -0
  693. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_messages_request.py +0 -0
  694. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_native.py +0 -0
  695. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_openai_responses_models.py +0 -0
  696. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_provider_input.py +0 -0
  697. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_provider_stream.py +0 -0
  698. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_reasoning_replay.py +0 -0
  699. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_responses_from_messages_stream.py +0 -0
  700. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_tokens.py +0 -0
  701. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_tool_adaptation.py +0 -0
  702. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_tool_search.py +0 -0
  703. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_async_iterators.py +0 -0
  704. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_desktop_model_ids.py +0 -0
  705. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_diagnostics.py +0 -0
  706. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_failure_protocol_mapping.py +0 -0
  707. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_failures.py +0 -0
  708. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_history_replay.py +0 -0
  709. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_history_switching.py +0 -0
  710. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_openai_chat.py +0 -0
  711. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_protocol_model_ownership.py +0 -0
  712. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_strict_sliding_window.py +0 -0
  713. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_token_estimation.py +0 -0
  714. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_tool_schema_patterns.py +0 -0
  715. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_trace.py +0 -0
  716. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_version.py +0 -0
  717. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_windows_dpi.py +0 -0
  718. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/__init__.py +0 -0
  719. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/test_claude_desktop_integration.py +0 -0
  720. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/test_claude_integration.py +0 -0
  721. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/test_codex_integration.py +0 -0
  722. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/test_codex_model_catalog.py +0 -0
  723. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/test_environment.py +0 -0
  724. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/test_integration_refresh.py +0 -0
  725. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/test_jetbrains_acp_integration.py +0 -0
  726. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_discord_markdown.py +0 -0
  727. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_discord_platform.py +0 -0
  728. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_event_parser.py +0 -0
  729. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_extract_text.py +0 -0
  730. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_handler.py +0 -0
  731. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_handler_context_isolation.py +0 -0
  732. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_handler_format.py +0 -0
  733. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_handler_integration.py +0 -0
  734. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_handler_markdown_and_status_edges.py +0 -0
  735. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_limiter.py +0 -0
  736. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_message_tree_transitions.py +0 -0
  737. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_messaging.py +0 -0
  738. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_messaging_factory.py +0 -0
  739. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_platform_outbox.py +0 -0
  740. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_platform_voice_flow.py +0 -0
  741. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_reliability.py +0 -0
  742. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_rendering_profiles.py +0 -0
  743. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_restart_reply_restore.py +0 -0
  744. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_robust_formatting.py +0 -0
  745. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_session_store_edge_cases.py +0 -0
  746. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_stream_transcript_contract.py +0 -0
  747. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_telegram.py +0 -0
  748. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_telegram_edge_cases.py +0 -0
  749. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_transcript.py +0 -0
  750. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_transcription.py +0 -0
  751. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_transcription_nim.py +0 -0
  752. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_tree_concurrency.py +0 -0
  753. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_tree_customer_regressions.py +0 -0
  754. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_tree_ownership_concurrency.py +0 -0
  755. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_tree_processor.py +0 -0
  756. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_tree_queue.py +0 -0
  757. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_tree_repository.py +0 -0
  758. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_voice_handlers.py +0 -0
  759. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_voice_services.py +0 -0
  760. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/provider_request_mocks.py +0 -0
  761. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/copilot_support.py +0 -0
  762. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/fixtures/copilot_responses_changing_ids.json +0 -0
  763. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/request_factory.py +0 -0
  764. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/support.py +0 -0
  765. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_agnes.py +0 -0
  766. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_anthropic_messages_transport.py +0 -0
  767. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_azure_openai.py +0 -0
  768. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_bedrock.py +0 -0
  769. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_cerebras.py +0 -0
  770. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_cheaperinference.py +0 -0
  771. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_chutes.py +0 -0
  772. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_cline_pass.py +0 -0
  773. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_cloudflare.py +0 -0
  774. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_codestral.py +0 -0
  775. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_cohere.py +0 -0
  776. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_converter.py +0 -0
  777. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_credential_validation.py +0 -0
  778. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_custom_provider.py +0 -0
  779. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_deepinfra.py +0 -0
  780. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_deepseek.py +0 -0
  781. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_endpoint_context_transports.py +0 -0
  782. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_execution_failure_boundary.py +0 -0
  783. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_experiential.py +0 -0
  784. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_failure_policy.py +0 -0
  785. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_featherless.py +0 -0
  786. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_fireworks.py +0 -0
  787. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_gemini.py +0 -0
  788. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_github_copilot_auth.py +0 -0
  789. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_github_copilot_broker.py +0 -0
  790. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_github_copilot_login.py +0 -0
  791. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_github_copilot_provider.py +0 -0
  792. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_github_copilot_responses_identity.py +0 -0
  793. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_github_copilot_sdk.py +0 -0
  794. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_groq.py +0 -0
  795. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_groq_reasoning.py +0 -0
  796. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_groq_tpm.py +0 -0
  797. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_history_corrections.py +0 -0
  798. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_history_transports.py +0 -0
  799. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_huggingface.py +0 -0
  800. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_kilo.py +0 -0
  801. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_kimi.py +0 -0
  802. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_kimi_code.py +0 -0
  803. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_lightning.py +0 -0
  804. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_llamacpp.py +0 -0
  805. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_llm7.py +0 -0
  806. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_lmstudio.py +0 -0
  807. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_messages_request_policy.py +0 -0
  808. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_minimax.py +0 -0
  809. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_mistral.py +0 -0
  810. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_model_discovery.py +0 -0
  811. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_model_token_limit_profiles.py +0 -0
  812. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_nararoute.py +0 -0
  813. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_nebius.py +0 -0
  814. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_novita.py +0 -0
  815. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_nvidia_nim.py +0 -0
  816. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_nvidia_nim_degraded_retry.py +0 -0
  817. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_nvidia_nim_native_tool_stream.py +0 -0
  818. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_nvidia_nim_reasoning.py +0 -0
  819. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_nvidia_nim_request.py +0 -0
  820. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_ollama.py +0 -0
  821. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_open_router.py +0 -0
  822. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_api_provider.py +0 -0
  823. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_api_sampling.py +0 -0
  824. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_chat_output_cap.py +0 -0
  825. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_chat_reasoning.py +0 -0
  826. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_chat_stream_output.py +0 -0
  827. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_chat_tool_names.py +0 -0
  828. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_chat_transport.py +0 -0
  829. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_chat_usage.py +0 -0
  830. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_codex_auth.py +0 -0
  831. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_codex_provider.py +0 -0
  832. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_compat_5xx_retry.py +0 -0
  833. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_model_listing_filters.py +0 -0
  834. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_responses_transport.py +0 -0
  835. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_opencode.py +0 -0
  836. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_parsers.py +0 -0
  837. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_poolside.py +0 -0
  838. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_provider_admission.py +0 -0
  839. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_provider_client_tool_discovery.py +0 -0
  840. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_provider_runtime.py +0 -0
  841. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_provider_transport_logging.py +0 -0
  842. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_qwencloud.py +0 -0
  843. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_qwencloud_coding.py +0 -0
  844. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_reasoning_capabilities.py +0 -0
  845. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_reasoning_compatibility.py +0 -0
  846. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_request_recovery_transitions.py +0 -0
  847. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_sambanova.py +0 -0
  848. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_scaleway.py +0 -0
  849. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_sdk_stream_lifecycle.py +0 -0
  850. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_siliconflow.py +0 -0
  851. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_stream_recovery.py +0 -0
  852. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_stream_startup_contract.py +0 -0
  853. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_streaming_errors.py +0 -0
  854. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_subagent_interception.py +0 -0
  855. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_together.py +0 -0
  856. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_vercel.py +0 -0
  857. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_vertex.py +0 -0
  858. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_wafer.py +0 -0
  859. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_wandb.py +0 -0
  860. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_xai.py +0 -0
  861. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_zai.py +0 -0
  862. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_zenmux.py +0 -0
  863. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/codex_fake_process.py +0 -0
  864. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_application_runtime.py +0 -0
  865. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_code_sessions_sqlite.py +0 -0
  866. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_codex_app_server.py +0 -0
  867. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_codex_catalog.py +0 -0
  868. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_codex_protocol.py +0 -0
  869. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_config_startup.py +0 -0
  870. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_config_transactions.py +0 -0
  871. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_configuration.py +0 -0
  872. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_custom_provider_lifecycle.py +0 -0
  873. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_folder_picker.py +0 -0
  874. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_integration_startup.py +0 -0
  875. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_model_cache.py +0 -0
  876. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_native_folder_dialog.py +0 -0
  877. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_progressive_startup.py +0 -0
  878. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_provider_manager.py +0 -0
  879. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_retired_chat.py +0 -0
  880. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_web_tools_client.py +0 -0
  881. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/scripts/conftest.py +0 -0
  882. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/scripts/test_ci_scripts.py +0 -0
  883. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/scripts/test_publish_release.py +0 -0
  884. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/scripts/test_release_package.py +0 -0
  885. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/scripts/test_release_workflow.py +0 -0
  886. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/scripts/test_version_policy.py +0 -0
  887. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/test_thread_diagnostics.py +0 -0
  888. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/web_tools_support.py +0 -0
  889. {free_claude_code-6.3.2 → free_claude_code-6.3.3}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: free-claude-code
3
- Version: 6.3.2
3
+ Version: 6.3.3
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
@@ -1726,7 +1726,13 @@ def test_off_clears_effort_when_reasoning_becomes_unavailable(
1726
1726
  ):
1727
1727
  url = create_session(page, admin_base_url, tmp_path)
1728
1728
  effort = page.locator("#codeReasoning")
1729
- effort.select_option("high")
1729
+ with page.expect_response(
1730
+ lambda response: (
1731
+ response.request.method == "PATCH" and "/api/code/sessions/" in response.url
1732
+ )
1733
+ ) as changed:
1734
+ effort.select_option("high")
1735
+ assert changed.value.json()["reasoning_effort"] == "high"
1730
1736
  expect(effort).to_be_enabled()
1731
1737
  page.locator("#codeComposer").fill("Preserve this draft")
1732
1738
  code_control.harness.efforts = ("off",)
@@ -22,6 +22,7 @@ from free_claude_code.config.env_migrations import (
22
22
  atomic_write_managed_config,
23
23
  settings_env_keys,
24
24
  )
25
+ from free_claude_code.config.paths import FCC_DATABASE_FILENAME
25
26
  from free_claude_code.config.provider_catalog import PROVIDER_CATALOG
26
27
  from smoke.lib.child_process import run_captured_text
27
28
  from smoke.lib.config import SmokeConfig
@@ -554,7 +555,11 @@ def test_codex_child_review_local_e2e(
554
555
  )
555
556
  assert marker.read_text().strip() == "smoke"
556
557
  with closing(
557
- sqlite3.connect(tmp_path / "home" / ".fcc" / "code" / "code.db")
558
+ sqlite3.connect(
559
+ (tmp_path / "home" / ".fcc" / FCC_DATABASE_FILENAME).as_uri()
560
+ + "?mode=ro",
561
+ uri=True,
562
+ )
558
563
  ) as database:
559
564
  root = database.execute(
560
565
  "SELECT native_thread_id FROM code_sessions WHERE id = ?",
@@ -17,6 +17,7 @@ CONFIG_LOCK_FILENAME = "config.lock"
17
17
  FCC_TEMP_DIRNAME = "tmp"
18
18
  LAUNCHER_TEMP_DIRNAME = "launchers"
19
19
  CODE_STATE_DIRNAME = "code"
20
+ FCC_DATABASE_FILENAME = "fcc.db"
20
21
  CODE_DATABASE_FILENAME = "code.db"
21
22
  CODE_LOCK_FILENAME = "code.lock"
22
23
 
@@ -45,8 +46,13 @@ def launcher_temp_dir_path() -> Path:
45
46
  return config_dir_path() / FCC_TEMP_DIRNAME / LAUNCHER_TEMP_DIRNAME
46
47
 
47
48
 
48
- def code_database_path() -> Path:
49
- """Return the managed Code sessions database path."""
49
+ def fcc_database_path() -> Path:
50
+ """Return the shared FCC database path."""
51
+ return config_dir_path() / FCC_DATABASE_FILENAME
52
+
53
+
54
+ def legacy_code_database_path() -> Path:
55
+ """Return the former Code database path for startup relocation."""
50
56
  return config_dir_path() / CODE_STATE_DIRNAME / CODE_DATABASE_FILENAME
51
57
 
52
58
 
@@ -11,8 +11,9 @@ from free_claude_code.application.code_sessions import CodeService
11
11
  from free_claude_code.config.loader import ManagedConfigStore
12
12
  from free_claude_code.config.logging_config import configure_logging
13
13
  from free_claude_code.config.paths import (
14
- code_database_path,
15
14
  code_lock_path,
15
+ fcc_database_path,
16
+ legacy_code_database_path,
16
17
  server_log_path,
17
18
  )
18
19
  from free_claude_code.config.settings import Settings
@@ -73,7 +74,11 @@ def build_asgi_app(
73
74
  model_catalog_publisher=CodexModelCatalogPublisher(),
74
75
  )
75
76
  code_service = CodeService(
76
- SQLiteCodeStore(code_database_path(), code_lock_path()),
77
+ SQLiteCodeStore(
78
+ fcc_database_path(),
79
+ code_lock_path(),
80
+ legacy_database_path=legacy_code_database_path(),
81
+ ),
77
82
  CodexHarnessFactory(provider_manager),
78
83
  )
79
84
  runtime = ApplicationRuntime(
@@ -25,6 +25,8 @@ from free_claude_code.application.code_sessions.models import (
25
25
  )
26
26
  from free_claude_code.core.interprocess_lock import InterprocessFileLock
27
27
 
28
+ from .sqlite_database import initialize_database
29
+
28
30
  _JSON_FIELDS = frozenset(
29
31
  {"raw", "form", "error_details", "request_id", "native_permission_defaults"}
30
32
  )
@@ -299,58 +301,16 @@ def _write_prompt(connection: sqlite3.Connection, prompt: CodePrompt) -> None:
299
301
  )
300
302
 
301
303
 
302
- def _migrate_prompt_entries(connection: sqlite3.Connection) -> None:
303
- """Give old prompts a permanent run-end position without rewriting history."""
304
- for row in connection.execute(
305
- "SELECT * FROM code_prompts ORDER BY rowid"
306
- ).fetchall():
307
- prompt = _record(CodePrompt, row)
308
- run = connection.execute(
309
- "SELECT id FROM code_runs WHERE session_id = ? AND native_turn_id = ?",
310
- (prompt.session_id, prompt.native_turn_id),
311
- ).fetchone()
312
- if run is None and prompt.native_item_id is not None:
313
- matches = connection.execute(
314
- "SELECT DISTINCT run_id AS id FROM code_items WHERE session_id = ? AND native_item_id = ?",
315
- (prompt.session_id, prompt.native_item_id),
316
- ).fetchall()
317
- if len(matches) == 1:
318
- run = matches[0]
319
- if run is None:
320
- run = connection.execute(
321
- "SELECT id FROM code_runs WHERE session_id = ? ORDER BY ordinal DESC LIMIT 1",
322
- (prompt.session_id,),
323
- ).fetchone()
324
- if run is None:
325
- raise CodeUnavailableError("A saved prompt has no saved conversation turn.")
326
- sequence = connection.execute(
327
- "SELECT COALESCE(MAX(sequence), 0) + 1 FROM code_items WHERE session_id = ?",
328
- (prompt.session_id,),
329
- ).fetchone()[0]
330
- _insert(
331
- connection,
332
- "code_items",
333
- CodeItem(
334
- id=prompt.id,
335
- session_id=prompt.session_id,
336
- run_id=run["id"],
337
- sequence=sequence,
338
- kind="prompt",
339
- complete=True,
340
- ),
341
- )
342
- connection.execute("CREATE TABLE code_prompts_new" + _PROMPT_COLUMNS)
343
- connection.execute("INSERT INTO code_prompts_new SELECT * FROM code_prompts")
344
- connection.execute("DROP TABLE code_prompts")
345
- connection.execute("ALTER TABLE code_prompts_new RENAME TO code_prompts")
346
- if connection.execute("PRAGMA foreign_key_check").fetchone() is not None:
347
- raise CodeUnavailableError("Code session history has an invalid record link.")
348
- connection.execute("PRAGMA user_version = 1")
349
-
350
-
351
304
  class SQLiteCodeStore:
352
- def __init__(self, database_path: Path, lock_path: Path) -> None:
305
+ def __init__(
306
+ self,
307
+ database_path: Path,
308
+ lock_path: Path,
309
+ *,
310
+ legacy_database_path: Path | None = None,
311
+ ) -> None:
353
312
  self._path = database_path
313
+ self._legacy_path = legacy_database_path
354
314
  self._lock = InterprocessFileLock(lock_path)
355
315
  self._started = False
356
316
  self._lifecycle = asyncio.Lock()
@@ -371,14 +331,28 @@ class SQLiteCodeStore:
371
331
  self._started = True
372
332
 
373
333
  def _initialize(self) -> None:
374
- self._path.parent.mkdir(parents=True, exist_ok=True)
375
334
  if not self._lock.acquire():
376
335
  raise CodeUnavailableError(
377
336
  "Code sessions is already owned by another FCC server."
378
337
  )
379
- if os.name != "nt":
380
- self._path.parent.chmod(0o700)
381
- self._execute(self._initialize_schema)
338
+ try:
339
+ self._path.parent.mkdir(parents=True, exist_ok=True)
340
+ if os.name != "nt":
341
+ self._path.parent.chmod(0o700)
342
+ initialize_database(self._path, self._legacy_path)
343
+ except sqlite3.IntegrityError as exc:
344
+ raise CodeConflictError(
345
+ "Saved Code history conflicts with its schema."
346
+ ) from exc
347
+ except sqlite3.Error as exc:
348
+ raise CodeUnavailableError(
349
+ f"Code storage initialization failed: {exc}"
350
+ ) from exc
351
+ except OSError as exc:
352
+ raise CodeUnavailableError(
353
+ "Code database files could not be initialized or moved."
354
+ ) from exc
355
+ self._execute(self._recover)
382
356
  if os.name != "nt":
383
357
  for path in (
384
358
  self._path,
@@ -412,30 +386,7 @@ class SQLiteCodeStore:
412
386
  raise CodeUnavailableError("Code session storage is closed.")
413
387
  return await anyio.to_thread.run_sync(self._execute, operation)
414
388
 
415
- def _initialize_schema(self, connection: sqlite3.Connection) -> None:
416
- connection.execute("PRAGMA journal_mode = WAL")
417
- connection.executescript(_SCHEMA)
418
- connection.execute("BEGIN IMMEDIATE")
419
- if connection.execute("PRAGMA user_version").fetchone()[0] == 0:
420
- _migrate_prompt_entries(connection)
421
- if connection.execute("PRAGMA user_version").fetchone()[0] == 1:
422
- for table in ("code_sessions", "code_runs"):
423
- connection.execute(
424
- f"ALTER TABLE {table} ADD COLUMN mode TEXT NOT NULL DEFAULT 'config' "
425
- "CHECK(mode IN ('config','ask','auto_review','full_access'))"
426
- )
427
- connection.execute(
428
- "ALTER TABLE code_sessions ADD COLUMN native_permission_defaults TEXT "
429
- "CHECK(native_permission_defaults IS NULL OR "
430
- "(json_valid(native_permission_defaults) AND json_type(native_permission_defaults) = 'object'))"
431
- )
432
- connection.execute("PRAGMA user_version = 2")
433
- if connection.execute("PRAGMA user_version").fetchone()[0] == 2:
434
- connection.execute(
435
- "ALTER TABLE code_sessions ADD COLUMN context_used_tokens INTEGER "
436
- "CHECK(context_used_tokens IS NULL OR context_used_tokens >= 0)"
437
- )
438
- connection.execute("PRAGMA user_version = 3")
389
+ def _recover(self, connection: sqlite3.Connection) -> None:
439
390
  connection.execute(
440
391
  "UPDATE code_runs SET status = 'interrupted', finished_at = ?, error = ? "
441
392
  "WHERE status IN ('preparing','running','stopping')",
@@ -735,51 +686,3 @@ class SQLiteCodeStore:
735
686
  connection.execute("DELETE FROM code_sessions WHERE id = ?", (session_id,))
736
687
 
737
688
  await self._run(operation)
738
-
739
-
740
- _PROMPT_COLUMNS = """(
741
- session_id TEXT NOT NULL REFERENCES code_sessions(id) ON DELETE CASCADE, id TEXT NOT NULL,
742
- generation TEXT NOT NULL, request_id TEXT NOT NULL, native_turn_id TEXT, native_item_id TEXT,
743
- kind TEXT NOT NULL, form TEXT NOT NULL, raw TEXT NOT NULL,
744
- status TEXT NOT NULL CHECK(status IN ('pending','answering','resolved','expired')), response_id TEXT, error TEXT,
745
- PRIMARY KEY(session_id,id), UNIQUE(session_id,generation,request_id), UNIQUE(session_id,response_id),
746
- FOREIGN KEY(session_id,id) REFERENCES code_items(session_id,id) ON DELETE CASCADE
747
- )"""
748
-
749
- _SCHEMA = (
750
- """
751
- CREATE TABLE IF NOT EXISTS code_sessions(
752
- id TEXT PRIMARY KEY NOT NULL, cwd TEXT NOT NULL, model TEXT NOT NULL, reasoning_effort TEXT,
753
- harness TEXT NOT NULL CHECK(harness = 'codex'), title TEXT NOT NULL, title_search TEXT NOT NULL,
754
- cwd_search TEXT NOT NULL, auto_title INTEGER NOT NULL CHECK(auto_title IN (0,1)), native_thread_id TEXT,
755
- native_may_have_input INTEGER NOT NULL CHECK(native_may_have_input IN (0,1)),
756
- revision INTEGER NOT NULL CHECK(revision > 0), status TEXT NOT NULL CHECK(status IN ('ready','deleting','delete_uncertain')),
757
- error TEXT, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL
758
- );
759
- CREATE INDEX IF NOT EXISTS code_sessions_recent ON code_sessions(updated_at DESC, id DESC);
760
- CREATE TABLE IF NOT EXISTS code_runs(
761
- session_id TEXT NOT NULL REFERENCES code_sessions(id) ON DELETE CASCADE, id TEXT NOT NULL,
762
- ordinal INTEGER NOT NULL CHECK(ordinal > 0), text TEXT NOT NULL, model TEXT NOT NULL, reasoning_effort TEXT,
763
- status TEXT NOT NULL CHECK(status IN ('preparing','running','stopping','completed','interrupted','failed')),
764
- submission_started INTEGER NOT NULL CHECK(submission_started IN (0,1)), native_turn_id TEXT,
765
- stop_requested INTEGER NOT NULL CHECK(stop_requested IN (0,1)), error TEXT, error_details TEXT NOT NULL,
766
- created_at INTEGER NOT NULL, finished_at INTEGER,
767
- PRIMARY KEY(session_id,id), UNIQUE(session_id,ordinal), UNIQUE(session_id,native_turn_id)
768
- );
769
- CREATE UNIQUE INDEX IF NOT EXISTS code_one_active_run ON code_runs(session_id)
770
- WHERE status IN ('preparing','running','stopping');
771
- CREATE TABLE IF NOT EXISTS code_items(
772
- session_id TEXT NOT NULL REFERENCES code_sessions(id) ON DELETE CASCADE, id TEXT NOT NULL,
773
- run_id TEXT NOT NULL, sequence INTEGER NOT NULL CHECK(sequence > 0), native_turn_id TEXT, native_item_id TEXT,
774
- kind TEXT NOT NULL, title TEXT NOT NULL, text TEXT NOT NULL, detail TEXT NOT NULL,
775
- complete INTEGER NOT NULL CHECK(complete IN (0,1)), raw TEXT NOT NULL,
776
- PRIMARY KEY(session_id,id), FOREIGN KEY(session_id,run_id) REFERENCES code_runs(session_id,id) ON DELETE CASCADE,
777
- UNIQUE(session_id,sequence), UNIQUE(session_id,native_turn_id,native_item_id)
778
- );
779
- CREATE INDEX IF NOT EXISTS code_items_run ON code_items(session_id,run_id,sequence);
780
- CREATE TABLE IF NOT EXISTS code_deleted(id TEXT PRIMARY KEY NOT NULL);
781
- """
782
- + "CREATE TABLE IF NOT EXISTS code_prompts"
783
- + _PROMPT_COLUMNS
784
- + ";"
785
- )
@@ -0,0 +1,163 @@
1
+ """Offline relocation and transactional schema initialization of FCC's database.
2
+
3
+ The caller must hold the Code owner lock until the store closes. Connections
4
+ opened here never escape initialization, including when migration fails.
5
+ """
6
+
7
+ import sqlite3
8
+ from contextlib import closing
9
+ from pathlib import Path
10
+
11
+ from .sqlite_migrations import MIGRATIONS
12
+
13
+ # Historical columns identify supported files without depending on live models.
14
+ _BASE_COLUMNS = {
15
+ "code_sessions": "id cwd model reasoning_effort harness title title_search cwd_search "
16
+ "auto_title native_thread_id native_may_have_input revision status error created_at updated_at",
17
+ "code_runs": "session_id id ordinal text model reasoning_effort status submission_started "
18
+ "native_turn_id stop_requested error error_details created_at finished_at",
19
+ "code_items": "session_id id run_id sequence native_turn_id native_item_id kind title text detail complete raw",
20
+ "code_prompts": "session_id id generation request_id native_turn_id native_item_id kind form raw status response_id error",
21
+ "code_deleted": "id",
22
+ }
23
+ _SIDECARS = ("-wal", "-shm", "-journal")
24
+
25
+
26
+ def _connect(path: Path, *, existing: bool = False) -> sqlite3.Connection:
27
+ connection = sqlite3.connect(
28
+ path.as_uri() + ("?mode=rw" if existing else "?mode=rwc"),
29
+ uri=True,
30
+ timeout=10,
31
+ autocommit=True,
32
+ )
33
+ connection.row_factory = sqlite3.Row
34
+ connection.execute("PRAGMA foreign_keys = ON")
35
+ return connection
36
+
37
+
38
+ def _schema_version(connection: sqlite3.Connection) -> int:
39
+ version = connection.execute("PRAGMA user_version").fetchone()[0]
40
+ if not 0 <= version <= MIGRATIONS[-1][0]:
41
+ raise sqlite3.DatabaseError(f"Unsupported FCC database version {version}.")
42
+ tables = {
43
+ row[0]
44
+ for row in connection.execute(
45
+ "SELECT name FROM sqlite_schema WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'"
46
+ )
47
+ }
48
+ if version == 0 and not tables:
49
+ return version
50
+ if tables != _BASE_COLUMNS.keys():
51
+ raise sqlite3.DatabaseError(
52
+ "Unrecognized FCC database schema. Saved data was preserved."
53
+ )
54
+ for table, baseline in _BASE_COLUMNS.items():
55
+ expected = set(baseline.split())
56
+ if version >= 2 and table in ("code_sessions", "code_runs"):
57
+ expected.add("mode")
58
+ if version >= 2 and table == "code_sessions":
59
+ expected.add("native_permission_defaults")
60
+ if version >= 3 and table == "code_sessions":
61
+ expected.add("context_used_tokens")
62
+ actual = {row[1] for row in connection.execute(f"PRAGMA table_info({table})")}
63
+ if not expected <= actual:
64
+ raise sqlite3.DatabaseError(f"Incomplete FCC database schema in {table}.")
65
+ return version
66
+
67
+
68
+ def _sidecars(path: Path) -> bool:
69
+ return any(
70
+ Path(f"{path}{suffix}").exists() or Path(f"{path}{suffix}").is_symlink()
71
+ for suffix in _SIDECARS
72
+ )
73
+
74
+
75
+ def _check_path(path: Path) -> None:
76
+ if path.is_symlink():
77
+ raise sqlite3.DatabaseError(
78
+ "FCC database path is redirected. Saved data was preserved."
79
+ )
80
+ if not path.exists() and _sidecars(path):
81
+ raise sqlite3.DatabaseError(
82
+ "FCC database has orphan journal files. Saved data was preserved."
83
+ )
84
+
85
+
86
+ def _relocate(source: Path, destination: Path) -> None:
87
+ with closing(_connect(source, existing=True)) as connection:
88
+ _schema_version(connection)
89
+ if connection.execute("PRAGMA journal_mode").fetchone()[0] == "wal":
90
+ busy, pages, checkpointed = connection.execute(
91
+ "PRAGMA wal_checkpoint(TRUNCATE)"
92
+ ).fetchone()
93
+ if busy or pages != checkpointed:
94
+ raise sqlite3.DatabaseError(
95
+ "FCC database checkpoint is busy. Stop FCC before updating."
96
+ )
97
+ if connection.execute("PRAGMA journal_mode=DELETE").fetchone()[0] != "delete":
98
+ raise sqlite3.DatabaseError(
99
+ "FCC database journals are still in use. Stop FCC before updating."
100
+ )
101
+ if _sidecars(source):
102
+ raise sqlite3.DatabaseError(
103
+ "FCC database journal files remain. Saved data was preserved."
104
+ )
105
+ _check_path(destination)
106
+ if destination.exists():
107
+ raise sqlite3.DatabaseError(
108
+ "FCC has both legacy and current databases. Resolve the file conflict before starting Code."
109
+ )
110
+ source.rename(destination)
111
+
112
+
113
+ def initialize_database(path: Path, legacy_path: Path | None = None) -> None:
114
+ """Apply pending migrations, relocating the legacy file first if present."""
115
+ if tuple(version for version, _ in MIGRATIONS) != tuple(
116
+ range(1, len(MIGRATIONS) + 1)
117
+ ):
118
+ raise sqlite3.DatabaseError(
119
+ "FCC database migration versions must be contiguous."
120
+ )
121
+ path = path.parent.resolve() / path.name
122
+ _check_path(path)
123
+ if legacy_path is not None:
124
+ legacy_path = (
125
+ legacy_path.parent.parent.resolve()
126
+ / legacy_path.parent.name
127
+ / legacy_path.name
128
+ )
129
+ if legacy_path.parent.resolve() != legacy_path.parent:
130
+ raise sqlite3.DatabaseError(
131
+ "Legacy Code directory is redirected. Saved data was preserved."
132
+ )
133
+ _check_path(legacy_path)
134
+ if legacy_path.exists() and path.exists():
135
+ raise sqlite3.DatabaseError(
136
+ "FCC has both legacy and current databases. Resolve the file conflict before starting Code."
137
+ )
138
+ path.parent.mkdir(parents=True, exist_ok=True)
139
+ if legacy_path is not None and legacy_path.exists():
140
+ _relocate(legacy_path, path)
141
+ with closing(_connect(path)) as connection:
142
+ version = _schema_version(connection)
143
+ if connection.execute("PRAGMA journal_mode=WAL").fetchone()[0] != "wal":
144
+ raise sqlite3.DatabaseError("FCC database could not enable WAL.")
145
+ for next_version, upgrade in MIGRATIONS:
146
+ if next_version <= version:
147
+ continue
148
+ connection.execute("BEGIN IMMEDIATE")
149
+ try:
150
+ upgrade(connection)
151
+ if (
152
+ connection.execute("PRAGMA foreign_key_check").fetchone()
153
+ is not None
154
+ ):
155
+ raise sqlite3.DatabaseError(
156
+ "FCC database has an invalid record link."
157
+ )
158
+ connection.execute(f"PRAGMA user_version={next_version}")
159
+ connection.execute("COMMIT")
160
+ except BaseException:
161
+ if connection.in_transaction:
162
+ connection.execute("ROLLBACK")
163
+ raise
@@ -0,0 +1,17 @@
1
+ """Ordered FCC database history. Published migrations are immutable.
2
+
3
+ Add the next numbered module and append its upgrade function here. The runner
4
+ owns transactions and user_version. Migrations use explicit execute statements,
5
+ never executescript, and must not import mutable domain models or serializers.
6
+ """
7
+
8
+ import sqlite3
9
+ from collections.abc import Callable
10
+
11
+ from . import v0001_code_schema, v0002_code_permissions, v0003_code_context_usage
12
+
13
+ MIGRATIONS: tuple[tuple[int, Callable[[sqlite3.Connection], None]], ...] = (
14
+ (1, v0001_code_schema.upgrade),
15
+ (2, v0002_code_permissions.upgrade),
16
+ (3, v0003_code_context_usage.upgrade),
17
+ )
@@ -0,0 +1,97 @@
1
+ """Version 1: baseline Code tables and permanent transcript entries for prompts."""
2
+
3
+ import sqlite3
4
+
5
+ _PROMPT_COLUMNS = """(
6
+ session_id TEXT NOT NULL REFERENCES code_sessions(id) ON DELETE CASCADE, id TEXT NOT NULL,
7
+ generation TEXT NOT NULL, request_id TEXT NOT NULL, native_turn_id TEXT, native_item_id TEXT,
8
+ kind TEXT NOT NULL, form TEXT NOT NULL, raw TEXT NOT NULL,
9
+ status TEXT NOT NULL CHECK(status IN ('pending','answering','resolved','expired')), response_id TEXT, error TEXT,
10
+ PRIMARY KEY(session_id,id), UNIQUE(session_id,generation,request_id), UNIQUE(session_id,response_id),
11
+ FOREIGN KEY(session_id,id) REFERENCES code_items(session_id,id) ON DELETE CASCADE
12
+ )"""
13
+
14
+ _SCHEMA = (
15
+ """CREATE TABLE IF NOT EXISTS code_sessions(
16
+ id TEXT PRIMARY KEY NOT NULL, cwd TEXT NOT NULL, model TEXT NOT NULL, reasoning_effort TEXT,
17
+ harness TEXT NOT NULL CHECK(harness = 'codex'), title TEXT NOT NULL, title_search TEXT NOT NULL,
18
+ cwd_search TEXT NOT NULL, auto_title INTEGER NOT NULL CHECK(auto_title IN (0,1)), native_thread_id TEXT,
19
+ native_may_have_input INTEGER NOT NULL CHECK(native_may_have_input IN (0,1)),
20
+ revision INTEGER NOT NULL CHECK(revision > 0), status TEXT NOT NULL CHECK(status IN ('ready','deleting','delete_uncertain')),
21
+ error TEXT, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL
22
+ )""",
23
+ """CREATE INDEX IF NOT EXISTS code_sessions_recent ON code_sessions(updated_at DESC, id DESC)""",
24
+ """CREATE TABLE IF NOT EXISTS code_runs(
25
+ session_id TEXT NOT NULL REFERENCES code_sessions(id) ON DELETE CASCADE, id TEXT NOT NULL,
26
+ ordinal INTEGER NOT NULL CHECK(ordinal > 0), text TEXT NOT NULL, model TEXT NOT NULL, reasoning_effort TEXT,
27
+ status TEXT NOT NULL CHECK(status IN ('preparing','running','stopping','completed','interrupted','failed')),
28
+ submission_started INTEGER NOT NULL CHECK(submission_started IN (0,1)), native_turn_id TEXT,
29
+ stop_requested INTEGER NOT NULL CHECK(stop_requested IN (0,1)), error TEXT, error_details TEXT NOT NULL,
30
+ created_at INTEGER NOT NULL, finished_at INTEGER,
31
+ PRIMARY KEY(session_id,id), UNIQUE(session_id,ordinal), UNIQUE(session_id,native_turn_id)
32
+ )""",
33
+ """CREATE UNIQUE INDEX IF NOT EXISTS code_one_active_run ON code_runs(session_id)
34
+ WHERE status IN ('preparing','running','stopping')""",
35
+ """CREATE TABLE IF NOT EXISTS code_items(
36
+ session_id TEXT NOT NULL REFERENCES code_sessions(id) ON DELETE CASCADE, id TEXT NOT NULL,
37
+ run_id TEXT NOT NULL, sequence INTEGER NOT NULL CHECK(sequence > 0), native_turn_id TEXT, native_item_id TEXT,
38
+ kind TEXT NOT NULL, title TEXT NOT NULL, text TEXT NOT NULL, detail TEXT NOT NULL,
39
+ complete INTEGER NOT NULL CHECK(complete IN (0,1)), raw TEXT NOT NULL,
40
+ PRIMARY KEY(session_id,id), FOREIGN KEY(session_id,run_id) REFERENCES code_runs(session_id,id) ON DELETE CASCADE,
41
+ UNIQUE(session_id,sequence), UNIQUE(session_id,native_turn_id,native_item_id)
42
+ )""",
43
+ """CREATE INDEX IF NOT EXISTS code_items_run ON code_items(session_id,run_id,sequence)""",
44
+ """CREATE TABLE IF NOT EXISTS code_deleted(id TEXT PRIMARY KEY NOT NULL)""",
45
+ """CREATE TABLE IF NOT EXISTS code_prompts(
46
+ session_id TEXT NOT NULL REFERENCES code_sessions(id) ON DELETE CASCADE, id TEXT NOT NULL,
47
+ generation TEXT NOT NULL, request_id TEXT NOT NULL, native_turn_id TEXT, native_item_id TEXT,
48
+ kind TEXT NOT NULL, form TEXT NOT NULL, raw TEXT NOT NULL,
49
+ status TEXT NOT NULL CHECK(status IN ('pending','answering','resolved','expired')), response_id TEXT, error TEXT,
50
+ PRIMARY KEY(session_id,id), UNIQUE(session_id,generation,request_id), UNIQUE(session_id,response_id),
51
+ FOREIGN KEY(session_id,id) REFERENCES code_items(session_id,id) ON DELETE CASCADE
52
+ )""",
53
+ )
54
+
55
+
56
+ def upgrade(connection: sqlite3.Connection) -> None:
57
+ for statement in _SCHEMA:
58
+ connection.execute(statement)
59
+ for prompt in connection.execute(
60
+ "SELECT * FROM code_prompts ORDER BY rowid"
61
+ ).fetchall():
62
+ run = connection.execute(
63
+ "SELECT id FROM code_runs WHERE session_id = ? AND native_turn_id = ?",
64
+ (prompt["session_id"], prompt["native_turn_id"]),
65
+ ).fetchone()
66
+ if run is None and prompt["native_item_id"] is not None:
67
+ matches = connection.execute(
68
+ "SELECT DISTINCT run_id AS id FROM code_items WHERE session_id = ? AND native_item_id = ?",
69
+ (prompt["session_id"], prompt["native_item_id"]),
70
+ ).fetchall()
71
+ if len(matches) == 1:
72
+ run = matches[0]
73
+ if run is None:
74
+ run = connection.execute(
75
+ "SELECT id FROM code_runs WHERE session_id = ? ORDER BY ordinal DESC LIMIT 1",
76
+ (prompt["session_id"],),
77
+ ).fetchone()
78
+ if run is None:
79
+ raise sqlite3.DatabaseError(
80
+ "A saved prompt has no saved conversation turn."
81
+ )
82
+ sequence = connection.execute(
83
+ "SELECT COALESCE(MAX(sequence), 0) + 1 FROM code_items WHERE session_id = ?",
84
+ (prompt["session_id"],),
85
+ ).fetchone()[0]
86
+ connection.execute(
87
+ "INSERT INTO code_items (session_id,id,run_id,sequence,kind,title,text,detail,complete,raw) "
88
+ "VALUES (?,?,?,?,'prompt','','','',1,'{}')",
89
+ (prompt["session_id"], prompt["id"], run["id"], sequence),
90
+ )
91
+ connection.execute("CREATE TABLE code_prompts_new" + _PROMPT_COLUMNS)
92
+ columns = "session_id,id,generation,request_id,native_turn_id,native_item_id,kind,form,raw,status,response_id,error"
93
+ connection.execute(
94
+ f"INSERT INTO code_prompts_new ({columns}) SELECT {columns} FROM code_prompts"
95
+ )
96
+ connection.execute("DROP TABLE code_prompts")
97
+ connection.execute("ALTER TABLE code_prompts_new RENAME TO code_prompts")
@@ -0,0 +1,16 @@
1
+ """Version 2: persisted permission mode and original native defaults."""
2
+
3
+ import sqlite3
4
+
5
+
6
+ def upgrade(connection: sqlite3.Connection) -> None:
7
+ for table in ("code_sessions", "code_runs"):
8
+ connection.execute(
9
+ f"ALTER TABLE {table} ADD COLUMN mode TEXT NOT NULL DEFAULT 'config' "
10
+ "CHECK(mode IN ('config','ask','auto_review','full_access'))"
11
+ )
12
+ connection.execute(
13
+ "ALTER TABLE code_sessions ADD COLUMN native_permission_defaults TEXT "
14
+ "CHECK(native_permission_defaults IS NULL OR "
15
+ "(json_valid(native_permission_defaults) AND json_type(native_permission_defaults) = 'object'))"
16
+ )
@@ -0,0 +1,10 @@
1
+ """Version 3: optional model context usage for Code sessions."""
2
+
3
+ import sqlite3
4
+
5
+
6
+ def upgrade(connection: sqlite3.Connection) -> None:
7
+ connection.execute(
8
+ "ALTER TABLE code_sessions ADD COLUMN context_used_tokens INTEGER "
9
+ "CHECK(context_used_tokens IS NULL OR context_used_tokens >= 0)"
10
+ )
@@ -0,0 +1,58 @@
1
+ """Exercise the live smoke's SQL assertion without launching a harness."""
2
+
3
+ import sqlite3
4
+ from contextlib import closing, nullcontext
5
+ from types import SimpleNamespace
6
+ from unittest.mock import MagicMock
7
+
8
+ import pytest
9
+
10
+ from free_claude_code.config.paths import FCC_DATABASE_FILENAME
11
+ from smoke.product import test_codex_modes_product_live as smoke
12
+
13
+
14
+ @pytest.mark.parametrize("database_exists", [False, True])
15
+ def test_child_review_smoke_reads_canonical_database_without_creating_files(
16
+ tmp_path, monkeypatch, database_exists
17
+ ):
18
+ home = tmp_path / "home/.fcc"
19
+ home.mkdir(parents=True)
20
+ (home / "code").mkdir()
21
+ database_path = home / FCC_DATABASE_FILENAME
22
+ if database_exists:
23
+ with closing(sqlite3.connect(database_path)) as connection, connection:
24
+ connection.execute("CREATE TABLE code_sessions(id, native_thread_id)")
25
+ connection.execute("INSERT INTO code_sessions VALUES ('session','parent')")
26
+ connection.execute("CREATE TABLE code_items(session_id,kind,raw)")
27
+ connection.execute(
28
+ "INSERT INTO code_items VALUES ('session','subagent_auto_review',?)",
29
+ ('{"threadId":"child"}',),
30
+ )
31
+ (tmp_path / "codex-home").mkdir()
32
+ (tmp_path / "child-marker.txt").write_text("smoke")
33
+ monkeypatch.setattr(smoke, "_environment", lambda *_: ({}, set()))
34
+ monkeypatch.setattr(
35
+ smoke,
36
+ "_canned_provider",
37
+ lambda *_: nullcontext(("http://provider.invalid", {"reviews": 1})),
38
+ )
39
+ monkeypatch.setattr(
40
+ smoke,
41
+ "SmokeServerDriver",
42
+ lambda *args, **kwargs: SimpleNamespace(
43
+ run=lambda: nullcontext(SimpleNamespace(base_url="http://server.invalid"))
44
+ ),
45
+ )
46
+
47
+ async def completed_review(*_):
48
+ return "session"
49
+
50
+ monkeypatch.setattr(smoke, "_exercise_child_review", completed_review)
51
+ config = MagicMock(spec=smoke.SmokeConfig, timeout_s=1)
52
+ if database_exists:
53
+ smoke.test_codex_child_review_local_e2e(config, tmp_path)
54
+ else:
55
+ with pytest.raises(sqlite3.OperationalError, match="unable to open"):
56
+ smoke.test_codex_child_review_local_e2e(config, tmp_path)
57
+ assert not (home / "code/code.db").exists()
58
+ assert database_path.exists() == database_exists