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.
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/PKG-INFO +1 -1
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_code_sessions.py +7 -1
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_codex_modes_product_live.py +6 -1
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/paths.py +8 -2
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/bootstrap.py +7 -2
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/code_sessions_sqlite.py +29 -126
- free_claude_code-6.3.3/src/free_claude_code/runtime/sqlite_database.py +163 -0
- free_claude_code-6.3.3/src/free_claude_code/runtime/sqlite_migrations/__init__.py +17 -0
- free_claude_code-6.3.3/src/free_claude_code/runtime/sqlite_migrations/v0001_code_schema.py +97 -0
- free_claude_code-6.3.3/src/free_claude_code/runtime/sqlite_migrations/v0002_code_permissions.py +16 -0
- free_claude_code-6.3.3/src/free_claude_code/runtime/sqlite_migrations/v0003_code_context_usage.py +10 -0
- free_claude_code-6.3.3/tests/contracts/test_codex_smoke_storage.py +58 -0
- free_claude_code-6.3.3/tests/runtime/fixtures/code_schema_v0.sql +39 -0
- free_claude_code-6.3.3/tests/runtime/test_sqlite_database.py +472 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.gitattributes +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/ISSUE_TEMPLATE/installation-problem.yml +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/actions/ci-environment/action.yml +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/dependabot.yml +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/workflows/post-merge.yml +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/workflows/tests.yml +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/workflows/validate-bug-report-version.yml +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.github/workflows/version-policy.yml +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/.gitignore +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/CONTRIBUTING.md +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/LICENSE +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/README.md +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/admin-messaging.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/admin-page.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/browser-code-session.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/cc-model-picker.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/codex-model-picker.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/codex.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/free-claude-code-wordmark-dark.svg +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/free-claude-code-wordmark-light.svg +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/how-it-works.mmd +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/how-it-works.svg +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/package-manager-uv.svg +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/assets/pic.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/conftest.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/code_support.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/conftest.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/form_support.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/provider_support.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_admin_apply.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_admin_assets.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_admin_integrations.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_admin_models.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_admin_providers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_claude_desktop_integration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_connected_accounts.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_custom_providers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_integration_notices.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_jetbrains_acp_integration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_progressive_startup.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_provider_modals.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/test_tool_schema_patterns.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/e2e/thread_diagnostics.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/pyproject.toml +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/check_version_policy.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/ci.ps1 +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/ci.sh +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/install-muse.ps1 +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/install.ps1 +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/install.sh +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/publish_release.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/uninstall-muse.ps1 +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/uninstall.ps1 +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/uninstall.sh +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/update/fcc-update +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/update/fcc-update.cmd +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/scripts/validate_release.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/README.md +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/assets/vision-fcc.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/capabilities.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/conftest.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/features.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/AGENTS.md +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/_pty_runner.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/conftest.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/fixtures/.gitattributes +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/fixtures/README.md +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/fixtures/rtk-LICENSE +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/fixtures/rtk-opencode-v1.ts +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/test_installers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/test_muse_windows_lifecycle.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/test_powershell_cache.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/installers/test_uninstallers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/child_process.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/claude_cli_matrix.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/config.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/e2e.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/http.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/local_providers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/outcomes.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/report.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/report_summary.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/server.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/lib/skips.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_api_prereq_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_auth_prereq_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_cli_prereq_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_client_shapes_prereq_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_local_provider_endpoints_prereq_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_messaging_prereq_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_provider_prereq_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_tools_prereq_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/prereq/test_voice_prereq_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_api_product_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_auth_product_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_cli_package_product_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_client_product_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_config_extensibility_product_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_live_platform_product_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_local_provider_product_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_messaging_product_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_model_fallback_product_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_nvidia_nim_cli_product_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_nvidia_nim_vision_product_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_openrouter_free_cli_product_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_provider_product_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_runtime_ownership_product_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_voice_product_live.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_cache.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_routes.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_security.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/admin.css +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/admin.js +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/code_sessions.css +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/code_sessions.js +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/form_controls.js +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/index.html +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/model_combobox.js +0 -0
- {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
- {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
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/SOURCES.md +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/agnesai.svg +0 -0
- {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
- {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
- {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
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/cheaperinference.svg +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/chutes.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/cline.svg +0 -0
- {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
- {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
- {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
- {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
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/experiential.svg +0 -0
- {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
- {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
- {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
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/githubcopilot.svg +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/groq.svg +0 -0
- {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
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/kilocode.svg +0 -0
- {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
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/lightning.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/llamacpp.svg +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/llm7.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/lmstudio.svg +0 -0
- {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
- {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
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/nararoute.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/nebius.svg +0 -0
- {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
- {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
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/ollama.svg +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/openai.svg +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/opencode.svg +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/openrouter.svg +0 -0
- {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
- {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
- {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
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/scaleway.svg +0 -0
- {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
- {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
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/tokenrouter.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/vercel.svg +0 -0
- {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
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/wafer.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/wandb.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/xai.svg +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/zai.svg +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/providers/zenmux.svg +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/session_layout.css +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/admin_static/session_ui.js +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/app.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/code_sessions_routes.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/command_utils.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/dependencies.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/detection.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/handlers/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/handlers/classifier_response.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/handlers/messages.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/handlers/responses.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/handlers/token_count.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/markdown.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/model_catalog.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/optimization_handlers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/ports.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/request_errors.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/request_ids.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/request_lifetime.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/response_streams.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/routes.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/api/validation_log.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/code_sessions/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/code_sessions/models.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/code_sessions/ports.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/code_sessions/service.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/code_sessions/state.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/connected_accounts.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/errors.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/execution.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/model_catalog.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/model_metadata.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/ports.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/readiness.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/reasoning.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/routing.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/session_events.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/web_tools/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/web_tools/ports.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/web_tools/request.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/application/web_tools/service.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/assets/app-icon.icns +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/assets/app-icon.ico +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/assets/app-icon.png +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/assets/app-icon.svg +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/clipboard.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/commands.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/desktop.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/desktop_assets.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/desktop_entrypoint.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/desktop_tray.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/doctor.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/entrypoints.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/aider.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/aider_config.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/catalog_http.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/claude.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/cline.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/cline_config.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/codex.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/common.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/dsh.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/dsh_config.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/grok.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/hermes.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/hermes_config.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/muse.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/opencode.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/opencode_config.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/pi.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/pi_extension.ts +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/launchers/runner.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/local_http.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/managed/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/managed/claude.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/managed/diagnostics.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/managed/manager.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/managed/session.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/process_registry.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/server_socket.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/cli/uvicorn_server.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/custom_providers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/manifest.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/persistence.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/provider_manifest.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/specs.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/state.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/status.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/validation.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/admin/values.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/constants.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/custom_providers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/env_files.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/env_migrations.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/loader.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/logging_config.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/model_refs.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/nim.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/provider_catalog.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/provider_proxies.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/reasoning.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/server_urls.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/config/settings.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/content.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/conversion.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/errors.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/image_sources.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/models.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/native.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/native_stream.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/request_serialization.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/request_snapshot.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/server_tool_sse.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/server_tool_types.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/sse_aggregation.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/stream_contracts.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/streaming/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/streaming/decoder.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/streaming/emitter.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/streaming/ledger.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/streaming/recovery.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/thinking.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/tokens.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/tool_results.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/tool_schema.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/tools.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/usage.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/anthropic/utils.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/async_iterators.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/async_tasks.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/data/README.md +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/data/TIKTOKEN-LICENSE +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/data/cl100k_base.tiktoken +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/diagnostics.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/failures.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/gateway_model_ids.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/history_replay.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/interprocess_lock.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/json_types.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/model_capabilities.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_chat.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/chat_request.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/errors.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/events.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/ids.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/items.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/messages_request.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/messages_stream.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/models.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/native.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/provider_input.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/provider_stream.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/reasoning.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/streaming/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/streaming/blocks.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/streaming/completion.py +0 -0
- {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
- {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
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/streaming/ledger.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/tokens.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/tool_adaptation.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/tool_search.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_responses/tools.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/openai_tool_names.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/rate_limit.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/reasoning.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/token_estimation.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/tool_schema_patterns.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/trace.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/version.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/web_tools.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/core/windows_dpi.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/claude.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/claude_desktop_integration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/claude_integration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/codex.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/codex_integration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/codex_model_catalog.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/config_file.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/environment.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/jetbrains_acp_integration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/launch.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/harnesses/resources.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/cli_event_constants.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/command_context.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/command_dispatcher.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/commands.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/event_parser.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/limiter.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/managed_protocols.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/models.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/node_event_pipeline.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/node_runner.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/discord.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/discord_inbound.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/discord_io.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/factory.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/outbox.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/ports.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/telegram.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/telegram_inbound.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/telegram_io.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/platforms/voice_flow.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/rendering/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/rendering/discord_markdown.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/rendering/markdown_tables.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/rendering/profiles.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/rendering/telegram_markdown.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/safe_diagnostics.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/session/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/session/managed_message_log.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/session/persistence.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/session/store.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/transcript/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/transcript/buffer.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/transcript/context.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/transcript/renderer.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/transcript/segments.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/transcript/subagents.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/transcription.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/graph.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/identity.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/manager.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/node.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/processor.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/queue.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/repository.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/runtime.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/snapshot.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/trees/transitions.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/turn_intake.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/ui_updates.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/voice.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/messaging/workflow.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/admission.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/anthropic_messages/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/anthropic_messages/request_policy.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/anthropic_messages/transport.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/base.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/cloudflare/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/cloudflare/client.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/credential_validation.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/custom.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/deepseek/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/deepseek/client.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/deepseek/compat.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/endpoint.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/endpoint_types.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/failure_policy.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/gemini/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/gemini/client.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/auth.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/broker.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/lifecycle.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/login.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/native_cli.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/provider.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/request_policy.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/responses_events.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/sdk.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/github_copilot/types.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/google_openai/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/google_openai/provider.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/google_openai/reasoning.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/google_openai/thought_signatures.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/groq/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/groq/client.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/groq/tpm.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/history_replay.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/http.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/kilo/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/kilo/client.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/kilo/models.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/lmstudio/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/lmstudio/client.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/mistral/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/mistral/client.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/mistral/reasoning.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/model_listing.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/nvidia_nim/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/nvidia_nim/client.py +0 -0
- {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
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/nvidia_nim/request_options.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/nvidia_nim/retry.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/nvidia_nim/tool_schema.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/nvidia_nim/voice.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/open_router/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/open_router/client.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_api/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_api/provider.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/base_url.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/behavior.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/client.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/extra_body.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/output_cap.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/profiles.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/provider.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/reasoning.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/reasoning_details.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/request_policy.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/stream_output.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/tool_calls.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/transport.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_chat/usage.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_client.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_codex/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_codex/auth.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_codex/endpoint.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_codex/login.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_codex/provider.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_responses/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_responses/presentation.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_responses/transport.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/openai_stream.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/opencode/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/opencode/catalog.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/opencode/provider.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/reasoning_compatibility.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/request_recovery.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/runtime/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/runtime/config.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/runtime/discovery.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/runtime/factory.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/runtime/model_cache.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/runtime/runtime.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/stream_recovery.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/vertex/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/vertex/auth.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/vertex/client.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/vertex/endpoint.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/providers/vertex/models.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/application.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/asgi.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/codex_app_server.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/codex_catalog.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/codex_protocol.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/configuration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/diagnostics.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/folder_picker.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/native_folder_dialog.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/provider_manager.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/retired_chat.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/web_tools/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/web_tools/client.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/web_tools/constants.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/web_tools/egress.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/src/free_claude_code/runtime/web_tools/parsers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/model_fallback_support.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/support.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_admin.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_admin_configuration_io.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_api.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_api_handlers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_app_lifespan_and_errors.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_app_version.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_auth.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_classifier_provider_compatibility.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_classifier_response.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_claude_desktop_integration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_code_sessions_routes.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_codex_integration_routes.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_dependencies.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_detection.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_execution_failure_contract.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_groq_token_limits.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_jetbrains_acp_integration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_managed_proxy_token.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_markdown.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_model_fallback.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_model_listing.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_openai_codex_compatibility.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_openai_responses.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_opencode_session_headers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_openrouter_image_errors.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_optimization_handlers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_ordinary_error_phases.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_request_ids.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_request_lifetime.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_request_utils.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_request_utils_filepaths_and_suggestions.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_response_streams.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_routes_optimizations.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_runtime_safe_logging.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_safe_logging.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_validation_log.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_vscode_integration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/api/test_web_server_tools.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_code_sessions.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_code_sessions_state.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_connected_accounts.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_execution.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_model_catalog.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_model_metadata.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_reasoning.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_request_conversion.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_routing.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_session_events.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/application/test_web_tools.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/conftest.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_aider_config.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_aider_launcher.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_catalog_http.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_claude_launcher.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_cli.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_cli_manager_edge_cases.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_cli_ownership.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_cline_launcher.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_codex_launcher.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_codex_model_catalog.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_config_restart_lifecycle.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_desktop.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_desktop_assets.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_doctor.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_dsh_config.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_dsh_launcher.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_entrypoints.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_grok_launcher.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_hermes_config.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_hermes_launcher.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_launcher_checks.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_launcher_environment.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_launcher_resources.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_launcher_workflow.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_local_http.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_managed_claude.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_managed_session_shutdown.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_model_catalog_decoder.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_muse_launcher.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_opencode_launcher.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_pi_extension.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_pi_launcher.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_process_registry.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_progressive_launch.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_server_shutdown.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/cli/test_update_wrapper.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/code_sessions_support.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_admin_credential_changes.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_admin_status.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_config.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_custom_provider_mutations.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_custom_providers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_env_migrations.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_fixed_cloud_endpoints.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_logging_config.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/config/test_provider_catalog.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/conftest.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_admin_provider_manifest.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_capability_map.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_feature_manifest.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_import_boundaries.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_issue_form_version_validation.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_issue_forms.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_local_provider_smoke.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_nvidia_nim_cli_matrix.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_offline_startup.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_packaging_contracts.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_protocol_matrix.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_provider_catalog_order.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_smoke_child_process.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_smoke_config.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_smoke_tiers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_startup_import_boundaries.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_stream_contracts.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/contracts/test_uv_policy.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_errors.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_image_sources.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_models.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_native_messages.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_native_messages_stream.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_native_sse_framing.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_openai_tool_names.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_request_serialization.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_response_models.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_server_tool_sse.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_sse_decoder.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_stream_ledger.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_stream_repair.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_text_tools.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_tool_results.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/anthropic/test_usage.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_chat_request.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_client_tool_discovery.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_messages_request.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_native.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_openai_responses_models.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_provider_input.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_provider_stream.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_reasoning_replay.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_responses_from_messages_stream.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_tokens.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_tool_adaptation.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/openai_responses/test_tool_search.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_async_iterators.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_desktop_model_ids.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_diagnostics.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_failure_protocol_mapping.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_failures.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_history_replay.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_history_switching.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_openai_chat.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_protocol_model_ownership.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_strict_sliding_window.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_token_estimation.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_tool_schema_patterns.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_trace.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_version.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/core/test_windows_dpi.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/__init__.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/test_claude_desktop_integration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/test_claude_integration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/test_codex_integration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/test_codex_model_catalog.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/test_environment.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/test_integration_refresh.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/harnesses/test_jetbrains_acp_integration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_discord_markdown.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_discord_platform.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_event_parser.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_extract_text.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_handler.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_handler_context_isolation.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_handler_format.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_handler_integration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_handler_markdown_and_status_edges.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_limiter.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_message_tree_transitions.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_messaging.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_messaging_factory.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_platform_outbox.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_platform_voice_flow.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_reliability.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_rendering_profiles.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_restart_reply_restore.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_robust_formatting.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_session_store_edge_cases.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_stream_transcript_contract.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_telegram.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_telegram_edge_cases.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_transcript.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_transcription.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_transcription_nim.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_tree_concurrency.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_tree_customer_regressions.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_tree_ownership_concurrency.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_tree_processor.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_tree_queue.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_tree_repository.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_voice_handlers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/messaging/test_voice_services.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/provider_request_mocks.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/copilot_support.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/fixtures/copilot_responses_changing_ids.json +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/request_factory.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/support.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_agnes.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_anthropic_messages_transport.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_azure_openai.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_bedrock.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_cerebras.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_cheaperinference.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_chutes.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_cline_pass.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_cloudflare.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_codestral.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_cohere.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_converter.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_credential_validation.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_custom_provider.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_deepinfra.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_deepseek.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_endpoint_context_transports.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_execution_failure_boundary.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_experiential.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_failure_policy.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_featherless.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_fireworks.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_gemini.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_github_copilot_auth.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_github_copilot_broker.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_github_copilot_login.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_github_copilot_provider.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_github_copilot_responses_identity.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_github_copilot_sdk.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_groq.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_groq_reasoning.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_groq_tpm.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_history_corrections.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_history_transports.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_huggingface.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_kilo.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_kimi.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_kimi_code.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_lightning.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_llamacpp.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_llm7.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_lmstudio.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_messages_request_policy.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_minimax.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_mistral.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_model_discovery.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_model_token_limit_profiles.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_nararoute.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_nebius.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_novita.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_nvidia_nim.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_nvidia_nim_degraded_retry.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_nvidia_nim_native_tool_stream.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_nvidia_nim_reasoning.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_nvidia_nim_request.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_ollama.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_open_router.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_api_provider.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_api_sampling.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_chat_output_cap.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_chat_reasoning.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_chat_stream_output.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_chat_tool_names.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_chat_transport.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_chat_usage.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_codex_auth.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_codex_provider.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_compat_5xx_retry.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_model_listing_filters.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_openai_responses_transport.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_opencode.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_parsers.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_poolside.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_provider_admission.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_provider_client_tool_discovery.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_provider_runtime.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_provider_transport_logging.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_qwencloud.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_qwencloud_coding.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_reasoning_capabilities.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_reasoning_compatibility.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_request_recovery_transitions.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_sambanova.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_scaleway.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_sdk_stream_lifecycle.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_siliconflow.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_stream_recovery.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_stream_startup_contract.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_streaming_errors.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_subagent_interception.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_together.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_vercel.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_vertex.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_wafer.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_wandb.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_xai.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_zai.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/providers/test_zenmux.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/codex_fake_process.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_application_runtime.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_code_sessions_sqlite.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_codex_app_server.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_codex_catalog.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_codex_protocol.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_config_startup.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_config_transactions.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_configuration.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_custom_provider_lifecycle.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_folder_picker.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_integration_startup.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_model_cache.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_native_folder_dialog.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_progressive_startup.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_provider_manager.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_retired_chat.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/runtime/test_web_tools_client.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/scripts/conftest.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/scripts/test_ci_scripts.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/scripts/test_publish_release.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/scripts/test_release_package.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/scripts/test_release_workflow.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/scripts/test_version_policy.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/test_thread_diagnostics.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/tests/web_tools_support.py +0 -0
- {free_claude_code-6.3.2 → free_claude_code-6.3.3}/uv.lock +0 -0
|
@@ -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
|
-
|
|
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",)
|
{free_claude_code-6.3.2 → free_claude_code-6.3.3}/smoke/product/test_codex_modes_product_live.py
RENAMED
|
@@ -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(
|
|
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
|
|
49
|
-
"""Return the
|
|
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(
|
|
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__(
|
|
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
|
-
|
|
380
|
-
self._path.parent.
|
|
381
|
-
|
|
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
|
|
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")
|
free_claude_code-6.3.3/src/free_claude_code/runtime/sqlite_migrations/v0002_code_permissions.py
ADDED
|
@@ -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
|
+
)
|
free_claude_code-6.3.3/src/free_claude_code/runtime/sqlite_migrations/v0003_code_context_usage.py
ADDED
|
@@ -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
|