my-claude-code 7.13.1__py3-none-any.whl
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.
- my_claude_code/__init__.py +1 -0
- my_claude_code/api/__init__.py +1 -0
- my_claude_code/api/admin_cache.py +49 -0
- my_claude_code/api/admin_claude_config_routes.py +212 -0
- my_claude_code/api/admin_custom_routes.py +610 -0
- my_claude_code/api/admin_desktop_app_routes.py +472 -0
- my_claude_code/api/admin_export_routes.py +455 -0
- my_claude_code/api/admin_harness_routes.py +621 -0
- my_claude_code/api/admin_routes.py +3517 -0
- my_claude_code/api/admin_server_routes.py +183 -0
- my_claude_code/api/admin_static/admin.css +7774 -0
- my_claude_code/api/admin_static/admin.js +18659 -0
- my_claude_code/api/admin_static/img/admin-analytics-cost.png +0 -0
- my_claude_code/api/admin_static/img/admin-analytics-harness.png +0 -0
- my_claude_code/api/admin_static/img/admin-analytics.png +0 -0
- my_claude_code/api/admin_static/img/admin-catalogue-refresh.png +0 -0
- my_claude_code/api/admin_static/img/admin-coding-agent-card.png +0 -0
- my_claude_code/api/admin_static/img/admin-coding-agents.png +0 -0
- my_claude_code/api/admin_static/img/admin-credential-health.png +0 -0
- my_claude_code/api/admin_static/img/admin-custom-provider.png +0 -0
- my_claude_code/api/admin_static/img/admin-desktop-apps.png +0 -0
- my_claude_code/api/admin_static/img/admin-get-started.png +0 -0
- my_claude_code/api/admin_static/img/admin-key-performance.png +0 -0
- my_claude_code/api/admin_static/img/admin-limits-calculator.png +0 -0
- my_claude_code/api/admin_static/img/admin-limits.png +0 -0
- my_claude_code/api/admin_static/img/admin-messaging.png +0 -0
- my_claude_code/api/admin_static/img/admin-model-config.png +0 -0
- my_claude_code/api/admin_static/img/admin-models-billed-est.png +0 -0
- my_claude_code/api/admin_static/img/admin-models-bulk.png +0 -0
- my_claude_code/api/admin_static/img/admin-models-learned.png +0 -0
- my_claude_code/api/admin_static/img/admin-models.png +0 -0
- my_claude_code/api/admin_static/img/admin-page.png +0 -0
- my_claude_code/api/admin_static/img/admin-providers.png +0 -0
- my_claude_code/api/admin_static/img/admin-request-contradiction.png +0 -0
- my_claude_code/api/admin_static/img/admin-request-detail.png +0 -0
- my_claude_code/api/admin_static/img/admin-requests.png +0 -0
- my_claude_code/api/admin_static/img/admin-version.png +0 -0
- my_claude_code/api/admin_static/img/admin-vision-adapter-mode.png +0 -0
- my_claude_code/api/admin_static/img/admin-websearch-analytics.png +0 -0
- my_claude_code/api/admin_static/img/admin-websearch.png +0 -0
- my_claude_code/api/admin_static/img/app-icon-96.png +0 -0
- my_claude_code/api/admin_static/img/cc-model-picker.png +0 -0
- my_claude_code/api/admin_static/img/claude-desktop-developer-menu.png +0 -0
- my_claude_code/api/admin_static/img/claude-desktop-gateway-config.png +0 -0
- my_claude_code/api/admin_static/img/codex-model-picker.png +0 -0
- my_claude_code/api/admin_static/index.html +4842 -0
- my_claude_code/api/admin_websearch_routes.py +121 -0
- my_claude_code/api/app.py +171 -0
- my_claude_code/api/dependencies.py +140 -0
- my_claude_code/api/detection.py +121 -0
- my_claude_code/api/docs_content.py +290 -0
- my_claude_code/api/docs_render.py +278 -0
- my_claude_code/api/gemini_model_catalog.py +71 -0
- my_claude_code/api/gemini_routes.py +245 -0
- my_claude_code/api/handlers/__init__.py +15 -0
- my_claude_code/api/handlers/chat_completions.py +335 -0
- my_claude_code/api/handlers/gemini.py +350 -0
- my_claude_code/api/handlers/messages.py +688 -0
- my_claude_code/api/handlers/responses.py +239 -0
- my_claude_code/api/handlers/token_count.py +85 -0
- my_claude_code/api/model_admin.py +1349 -0
- my_claude_code/api/model_catalog.py +264 -0
- my_claude_code/api/models_page_cache.py +166 -0
- my_claude_code/api/optimization_handlers.py +223 -0
- my_claude_code/api/ports.py +62 -0
- my_claude_code/api/request_capture.py +1397 -0
- my_claude_code/api/request_errors.py +112 -0
- my_claude_code/api/request_ids.py +100 -0
- my_claude_code/api/request_pricing.py +209 -0
- my_claude_code/api/response_streams.py +470 -0
- my_claude_code/api/routes.py +310 -0
- my_claude_code/api/validation_log.py +46 -0
- my_claude_code/api/web_tools/__init__.py +51 -0
- my_claude_code/api/web_tools/constants.py +17 -0
- my_claude_code/api/web_tools/egress.py +105 -0
- my_claude_code/api/web_tools/outbound.py +692 -0
- my_claude_code/api/web_tools/parsers.py +102 -0
- my_claude_code/api/web_tools/request.py +132 -0
- my_claude_code/api/web_tools/search_providers.py +56 -0
- my_claude_code/api/web_tools/streaming.py +315 -0
- my_claude_code/api/wire_surfaces.py +66 -0
- my_claude_code/application/__init__.py +1 -0
- my_claude_code/application/catalogue_model.py +512 -0
- my_claude_code/application/catalogues/__init__.py +166 -0
- my_claude_code/application/catalogues/aider.py +249 -0
- my_claude_code/application/catalogues/base.py +265 -0
- my_claude_code/application/catalogues/claude_desktop.py +80 -0
- my_claude_code/application/catalogues/cline.py +211 -0
- my_claude_code/application/catalogues/codex.py +294 -0
- my_claude_code/application/catalogues/commandcode.py +303 -0
- my_claude_code/application/catalogues/crush.py +394 -0
- my_claude_code/application/catalogues/droid.py +184 -0
- my_claude_code/application/catalogues/gemini_cli.py +237 -0
- my_claude_code/application/catalogues/goose.py +254 -0
- my_claude_code/application/catalogues/kilo.py +69 -0
- my_claude_code/application/catalogues/kimi.py +245 -0
- my_claude_code/application/catalogues/opencode.py +365 -0
- my_claude_code/application/catalogues/pi.py +131 -0
- my_claude_code/application/catalogues/qwen.py +262 -0
- my_claude_code/application/catalogues/vscode.py +147 -0
- my_claude_code/application/cost.py +323 -0
- my_claude_code/application/deadline_hints.py +98 -0
- my_claude_code/application/derived_payloads.py +224 -0
- my_claude_code/application/desktop_documents.py +379 -0
- my_claude_code/application/errors.py +80 -0
- my_claude_code/application/execution.py +2238 -0
- my_claude_code/application/model_metadata.py +565 -0
- my_claude_code/application/output_tokens.py +335 -0
- my_claude_code/application/ports.py +165 -0
- my_claude_code/application/reasoning.py +112 -0
- my_claude_code/application/reasoning_budget.py +229 -0
- my_claude_code/application/reasoning_gating.py +719 -0
- my_claude_code/application/release_updates.py +1485 -0
- my_claude_code/application/route_health.py +441 -0
- my_claude_code/application/routing.py +1282 -0
- my_claude_code/application/tier_chains.py +175 -0
- my_claude_code/application/vision_describe.py +529 -0
- my_claude_code/assets/app-icon.icns +0 -0
- my_claude_code/assets/app-icon.ico +0 -0
- my_claude_code/assets/app-icon.png +0 -0
- my_claude_code/assets/tray-icon.png +0 -0
- my_claude_code/cli/__init__.py +5 -0
- my_claude_code/cli/apps_command.py +274 -0
- my_claude_code/cli/claude_env.py +118 -0
- my_claude_code/cli/commands.py +827 -0
- my_claude_code/cli/desktop.py +1239 -0
- my_claude_code/cli/desktop_assets.py +153 -0
- my_claude_code/cli/desktop_entrypoint.py +232 -0
- my_claude_code/cli/desktop_status.py +360 -0
- my_claude_code/cli/desktop_tray.py +249 -0
- my_claude_code/cli/desktop_window.py +635 -0
- my_claude_code/cli/entrypoints.py +217 -0
- my_claude_code/cli/first_start.py +205 -0
- my_claude_code/cli/harnesses/__init__.py +6 -0
- my_claude_code/cli/harnesses/catalogue_client.py +243 -0
- my_claude_code/cli/harnesses/catalogue_documents.py +110 -0
- my_claude_code/cli/harnesses/registry.py +53 -0
- my_claude_code/cli/installer_support.py +467 -0
- my_claude_code/cli/launchers/__init__.py +1 -0
- my_claude_code/cli/launchers/aider.py +268 -0
- my_claude_code/cli/launchers/claude.py +126 -0
- my_claude_code/cli/launchers/cline.py +270 -0
- my_claude_code/cli/launchers/codex.py +235 -0
- my_claude_code/cli/launchers/commandcode.py +243 -0
- my_claude_code/cli/launchers/common.py +183 -0
- my_claude_code/cli/launchers/crush.py +231 -0
- my_claude_code/cli/launchers/droid.py +226 -0
- my_claude_code/cli/launchers/gemini.py +322 -0
- my_claude_code/cli/launchers/goose.py +269 -0
- my_claude_code/cli/launchers/kimi.py +214 -0
- my_claude_code/cli/launchers/opencode.py +203 -0
- my_claude_code/cli/launchers/pi.py +158 -0
- my_claude_code/cli/launchers/pi_extension.ts +216 -0
- my_claude_code/cli/launchers/qwen.py +266 -0
- my_claude_code/cli/legacy_stubs.py +85 -0
- my_claude_code/cli/managed/__init__.py +6 -0
- my_claude_code/cli/managed/claude.py +215 -0
- my_claude_code/cli/managed/diagnostics.py +47 -0
- my_claude_code/cli/managed/manager.py +207 -0
- my_claude_code/cli/managed/session.py +293 -0
- my_claude_code/cli/migrate_config_dir.py +479 -0
- my_claude_code/cli/port_diagnostics.py +142 -0
- my_claude_code/cli/port_takeover.py +308 -0
- my_claude_code/cli/process_registry.py +85 -0
- my_claude_code/cli/rtk_commands.py +117 -0
- my_claude_code/cli/tool_paths.py +58 -0
- my_claude_code/config/__init__.py +5 -0
- my_claude_code/config/admin/__init__.py +1 -0
- my_claude_code/config/admin/manifest.py +2485 -0
- my_claude_code/config/admin/persistence.py +425 -0
- my_claude_code/config/admin/provider_manifest.py +749 -0
- my_claude_code/config/admin/route_refs.py +119 -0
- my_claude_code/config/admin/sources.py +91 -0
- my_claude_code/config/admin/spec.py +71 -0
- my_claude_code/config/admin/status.py +129 -0
- my_claude_code/config/admin/validation.py +81 -0
- my_claude_code/config/admin/values.py +256 -0
- my_claude_code/config/admin/websearch_manifest.py +280 -0
- my_claude_code/config/atomic_json.py +69 -0
- my_claude_code/config/claude_code_catalog.py +242 -0
- my_claude_code/config/claude_config_editor.py +443 -0
- my_claude_code/config/claude_discovery.py +225 -0
- my_claude_code/config/claude_settings.py +426 -0
- my_claude_code/config/constants.py +669 -0
- my_claude_code/config/credentials.py +21 -0
- my_claude_code/config/data/__init__.py +1 -0
- my_claude_code/config/data/claude_code_config_catalog.json +6105 -0
- my_claude_code/config/desktop.py +792 -0
- my_claude_code/config/desktop_apply.py +1810 -0
- my_claude_code/config/desktop_apps.py +1873 -0
- my_claude_code/config/desktop_shell.py +1032 -0
- my_claude_code/config/document_codecs.py +923 -0
- my_claude_code/config/env.example +1584 -0
- my_claude_code/config/env_files.py +192 -0
- my_claude_code/config/env_migrations.py +234 -0
- my_claude_code/config/env_template.py +76 -0
- my_claude_code/config/harness_attribution.py +42 -0
- my_claude_code/config/harness_base_url.py +104 -0
- my_claude_code/config/harness_cline.py +159 -0
- my_claude_code/config/harness_config_merge.py +326 -0
- my_claude_code/config/harness_tiers.py +386 -0
- my_claude_code/config/harness_toml.py +227 -0
- my_claude_code/config/harnesses.py +1702 -0
- my_claude_code/config/legacy_env_rewrite.py +158 -0
- my_claude_code/config/limits.py +318 -0
- my_claude_code/config/logging_config.py +372 -0
- my_claude_code/config/model_overrides.py +383 -0
- my_claude_code/config/model_refs.py +120 -0
- my_claude_code/config/nim.py +119 -0
- my_claude_code/config/onboarding.py +458 -0
- my_claude_code/config/paths.py +724 -0
- my_claude_code/config/provider_catalog.py +912 -0
- my_claude_code/config/provider_registry.py +539 -0
- my_claude_code/config/proxy_auth.py +73 -0
- my_claude_code/config/reasoning.py +25 -0
- my_claude_code/config/reasoning_enum.py +146 -0
- my_claude_code/config/restore_record.py +420 -0
- my_claude_code/config/rtk.py +563 -0
- my_claude_code/config/server_urls.py +32 -0
- my_claude_code/config/settings.py +2260 -0
- my_claude_code/config/update_progress.py +492 -0
- my_claude_code/config/websearch_catalog.py +925 -0
- my_claude_code/core/__init__.py +15 -0
- my_claude_code/core/anthropic/__init__.py +128 -0
- my_claude_code/core/anthropic/content.py +31 -0
- my_claude_code/core/anthropic/conversion.py +968 -0
- my_claude_code/core/anthropic/errors.py +93 -0
- my_claude_code/core/anthropic/image_downscale.py +185 -0
- my_claude_code/core/anthropic/image_tokens.py +349 -0
- my_claude_code/core/anthropic/models.py +183 -0
- my_claude_code/core/anthropic/openai_tool_names.py +124 -0
- my_claude_code/core/anthropic/request_modalities.py +130 -0
- my_claude_code/core/anthropic/request_serialization.py +57 -0
- my_claude_code/core/anthropic/request_snapshot.py +35 -0
- my_claude_code/core/anthropic/server_tool_sse.py +12 -0
- my_claude_code/core/anthropic/sse_aggregation.py +128 -0
- my_claude_code/core/anthropic/stream_contracts.py +343 -0
- my_claude_code/core/anthropic/streaming/__init__.py +39 -0
- my_claude_code/core/anthropic/streaming/emitter.py +62 -0
- my_claude_code/core/anthropic/streaming/ledger.py +550 -0
- my_claude_code/core/anthropic/streaming/recovery.py +212 -0
- my_claude_code/core/anthropic/streaming/splice.py +542 -0
- my_claude_code/core/anthropic/streaming/truncation.py +297 -0
- my_claude_code/core/anthropic/thinking.py +140 -0
- my_claude_code/core/anthropic/tokens.py +169 -0
- my_claude_code/core/anthropic/tool_result_media.py +524 -0
- my_claude_code/core/anthropic/tool_result_trimming.py +487 -0
- my_claude_code/core/anthropic/tool_schema.py +94 -0
- my_claude_code/core/anthropic/tools.py +462 -0
- my_claude_code/core/anthropic/upstream_errors.py +55 -0
- my_claude_code/core/anthropic/utils.py +9 -0
- my_claude_code/core/async_iterators.py +26 -0
- my_claude_code/core/catalogue_refs.py +84 -0
- my_claude_code/core/client_fingerprint.py +415 -0
- my_claude_code/core/credential_attribution.py +73 -0
- my_claude_code/core/credential_rotation.py +582 -0
- my_claude_code/core/derived_cache.py +172 -0
- my_claude_code/core/diagnostics.py +330 -0
- my_claude_code/core/export.py +1334 -0
- my_claude_code/core/failures.py +147 -0
- my_claude_code/core/gateway_model_ids.py +51 -0
- my_claude_code/core/gemini_api/__init__.py +59 -0
- my_claude_code/core/gemini_api/adapter.py +69 -0
- my_claude_code/core/gemini_api/assembler.py +258 -0
- my_claude_code/core/gemini_api/catalog.py +58 -0
- my_claude_code/core/gemini_api/errors.py +131 -0
- my_claude_code/core/gemini_api/events.py +51 -0
- my_claude_code/core/gemini_api/input.py +558 -0
- my_claude_code/core/gemini_api/models.py +186 -0
- my_claude_code/core/gemini_api/paths.py +77 -0
- my_claude_code/core/gemini_api/response.py +74 -0
- my_claude_code/core/gemini_api/stream.py +97 -0
- my_claude_code/core/gemini_api/tools.py +203 -0
- my_claude_code/core/gemini_api/usage.py +92 -0
- my_claude_code/core/identity.py +161 -0
- my_claude_code/core/image_geometry.py +200 -0
- my_claude_code/core/interprocess_lock.py +90 -0
- my_claude_code/core/mcc_processes.py +687 -0
- my_claude_code/core/model_ids.py +224 -0
- my_claude_code/core/model_visibility.py +215 -0
- my_claude_code/core/openai_chat_completions/__init__.py +25 -0
- my_claude_code/core/openai_chat_completions/adapter.py +72 -0
- my_claude_code/core/openai_chat_completions/assembler.py +250 -0
- my_claude_code/core/openai_chat_completions/completion.py +99 -0
- my_claude_code/core/openai_chat_completions/errors.py +34 -0
- my_claude_code/core/openai_chat_completions/events.py +46 -0
- my_claude_code/core/openai_chat_completions/ids.py +12 -0
- my_claude_code/core/openai_chat_completions/input.py +403 -0
- my_claude_code/core/openai_chat_completions/models.py +69 -0
- my_claude_code/core/openai_chat_completions/stream.py +97 -0
- my_claude_code/core/openai_chat_completions/tools.py +139 -0
- my_claude_code/core/openai_chat_completions/usage.py +88 -0
- my_claude_code/core/openai_common/__init__.py +29 -0
- my_claude_code/core/openai_common/anthropic_sse.py +75 -0
- my_claude_code/core/openai_common/errors.py +74 -0
- my_claude_code/core/openai_common/usage.py +26 -0
- my_claude_code/core/openai_responses/__init__.py +17 -0
- my_claude_code/core/openai_responses/adapter.py +39 -0
- my_claude_code/core/openai_responses/anthropic_sse.py +15 -0
- my_claude_code/core/openai_responses/errors.py +28 -0
- my_claude_code/core/openai_responses/events.py +17 -0
- my_claude_code/core/openai_responses/ids.py +19 -0
- my_claude_code/core/openai_responses/input.py +388 -0
- my_claude_code/core/openai_responses/items.py +35 -0
- my_claude_code/core/openai_responses/models.py +26 -0
- my_claude_code/core/openai_responses/reasoning.py +54 -0
- my_claude_code/core/openai_responses/stream.py +92 -0
- my_claude_code/core/openai_responses/streaming/__init__.py +5 -0
- my_claude_code/core/openai_responses/streaming/assembler.py +356 -0
- my_claude_code/core/openai_responses/streaming/blocks.py +36 -0
- my_claude_code/core/openai_responses/streaming/completion.py +154 -0
- my_claude_code/core/openai_responses/streaming/error_mapping.py +28 -0
- my_claude_code/core/openai_responses/streaming/event_builders.py +182 -0
- my_claude_code/core/openai_responses/streaming/ledger.py +105 -0
- my_claude_code/core/openai_responses/tools.py +375 -0
- my_claude_code/core/openai_responses/usage.py +11 -0
- my_claude_code/core/optimization_discovery.py +314 -0
- my_claude_code/core/process_handoff.py +24 -0
- my_claude_code/core/rate_limit.py +321 -0
- my_claude_code/core/reasoning.py +490 -0
- my_claude_code/core/reported_cost.py +199 -0
- my_claude_code/core/request_headers.py +153 -0
- my_claude_code/core/request_images.py +164 -0
- my_claude_code/core/request_log.py +7447 -0
- my_claude_code/core/server_inventory.py +431 -0
- my_claude_code/core/startup_state.py +229 -0
- my_claude_code/core/stop_deadline.py +228 -0
- my_claude_code/core/tier_refs.py +394 -0
- my_claude_code/core/token_encoder.py +36 -0
- my_claude_code/core/trace.py +197 -0
- my_claude_code/core/upstream_ladder.py +668 -0
- my_claude_code/core/version.py +39 -0
- my_claude_code/core/waiting_clock.py +71 -0
- my_claude_code/core/websearch/__init__.py +8 -0
- my_claude_code/core/websearch/models.py +30 -0
- my_claude_code/core/wire_capture.py +855 -0
- my_claude_code/docs_bundle/ANTHROPIC-SUBSCRIPTION.md +378 -0
- my_claude_code/docs_bundle/ARCHITECTURE.md +2661 -0
- my_claude_code/docs_bundle/CLAUDE-CODE-CONFIG.md +982 -0
- my_claude_code/docs_bundle/CLIENTS.md +143 -0
- my_claude_code/docs_bundle/CONTRIBUTING.md +64 -0
- my_claude_code/docs_bundle/DOCS-README.md +21 -0
- my_claude_code/docs_bundle/MESSAGING.md +90 -0
- my_claude_code/docs_bundle/OAUTH-PROVIDERS.md +98 -0
- my_claude_code/docs_bundle/README.md +378 -0
- my_claude_code/docs_bundle/ROUTING-REFERENCE.md +310 -0
- my_claude_code/docs_bundle/USAGE.md +4484 -0
- my_claude_code/docs_bundle/WEB-SEARCH.md +209 -0
- my_claude_code/installers/install.ps1 +4675 -0
- my_claude_code/installers/install.sh +2644 -0
- my_claude_code/messaging/__init__.py +16 -0
- my_claude_code/messaging/cli_event_constants.py +67 -0
- my_claude_code/messaging/command_context.py +99 -0
- my_claude_code/messaging/command_dispatcher.py +31 -0
- my_claude_code/messaging/commands.py +182 -0
- my_claude_code/messaging/event_parser.py +184 -0
- my_claude_code/messaging/limiter.py +342 -0
- my_claude_code/messaging/managed_protocols.py +35 -0
- my_claude_code/messaging/models.py +57 -0
- my_claude_code/messaging/node_event_pipeline.py +120 -0
- my_claude_code/messaging/node_runner.py +408 -0
- my_claude_code/messaging/platforms/__init__.py +20 -0
- my_claude_code/messaging/platforms/discord.py +319 -0
- my_claude_code/messaging/platforms/discord_inbound.py +112 -0
- my_claude_code/messaging/platforms/discord_io.py +167 -0
- my_claude_code/messaging/platforms/factory.py +109 -0
- my_claude_code/messaging/platforms/outbox.py +143 -0
- my_claude_code/messaging/platforms/ports.py +99 -0
- my_claude_code/messaging/platforms/telegram.py +300 -0
- my_claude_code/messaging/platforms/telegram_inbound.py +133 -0
- my_claude_code/messaging/platforms/telegram_io.py +287 -0
- my_claude_code/messaging/platforms/voice_flow.py +388 -0
- my_claude_code/messaging/rendering/__init__.py +3 -0
- my_claude_code/messaging/rendering/discord_markdown.py +318 -0
- my_claude_code/messaging/rendering/markdown_tables.py +47 -0
- my_claude_code/messaging/rendering/profiles.py +53 -0
- my_claude_code/messaging/rendering/telegram_markdown.py +327 -0
- my_claude_code/messaging/safe_diagnostics.py +15 -0
- my_claude_code/messaging/session/__init__.py +5 -0
- my_claude_code/messaging/session/managed_message_log.py +135 -0
- my_claude_code/messaging/session/persistence.py +161 -0
- my_claude_code/messaging/session/store.py +162 -0
- my_claude_code/messaging/transcript/__init__.py +6 -0
- my_claude_code/messaging/transcript/buffer.py +220 -0
- my_claude_code/messaging/transcript/context.py +18 -0
- my_claude_code/messaging/transcript/renderer.py +65 -0
- my_claude_code/messaging/transcript/segments.py +176 -0
- my_claude_code/messaging/transcript/subagents.py +108 -0
- my_claude_code/messaging/transcription.py +132 -0
- my_claude_code/messaging/trees/__init__.py +41 -0
- my_claude_code/messaging/trees/graph.py +250 -0
- my_claude_code/messaging/trees/identity.py +16 -0
- my_claude_code/messaging/trees/manager.py +587 -0
- my_claude_code/messaging/trees/node.py +56 -0
- my_claude_code/messaging/trees/processor.py +272 -0
- my_claude_code/messaging/trees/queue.py +47 -0
- my_claude_code/messaging/trees/repository.py +135 -0
- my_claude_code/messaging/trees/runtime.py +487 -0
- my_claude_code/messaging/trees/snapshot.py +221 -0
- my_claude_code/messaging/trees/transitions.py +174 -0
- my_claude_code/messaging/turn_intake.py +241 -0
- my_claude_code/messaging/ui_updates.py +99 -0
- my_claude_code/messaging/voice.py +376 -0
- my_claude_code/messaging/workflow.py +714 -0
- my_claude_code/providers/__init__.py +12 -0
- my_claude_code/providers/anthropic/__init__.py +10 -0
- my_claude_code/providers/anthropic/models.py +55 -0
- my_claude_code/providers/anthropic/provider.py +160 -0
- my_claude_code/providers/anthropic_messages/__init__.py +21 -0
- my_claude_code/providers/anthropic_messages/auth.py +55 -0
- my_claude_code/providers/anthropic_messages/probe.py +19 -0
- my_claude_code/providers/anthropic_messages/provider.py +527 -0
- my_claude_code/providers/anthropic_messages/request.py +175 -0
- my_claude_code/providers/anthropic_messages/streaming.py +130 -0
- my_claude_code/providers/anthropic_oauth/__init__.py +74 -0
- my_claude_code/providers/anthropic_oauth/auth.py +266 -0
- my_claude_code/providers/anthropic_oauth/betas.py +48 -0
- my_claude_code/providers/anthropic_oauth/cli.py +242 -0
- my_claude_code/providers/anthropic_oauth/constants.py +270 -0
- my_claude_code/providers/anthropic_oauth/credentials.py +729 -0
- my_claude_code/providers/anthropic_oauth/entrypoint.py +109 -0
- my_claude_code/providers/anthropic_oauth/loopback.py +311 -0
- my_claude_code/providers/anthropic_oauth/oauth_login.py +222 -0
- my_claude_code/providers/anthropic_oauth/provider.py +341 -0
- my_claude_code/providers/anthropic_oauth/rate_limit_headers.py +137 -0
- my_claude_code/providers/base.py +206 -0
- my_claude_code/providers/chatgpt_oauth/__init__.py +6 -0
- my_claude_code/providers/chatgpt_oauth/browser_login.py +546 -0
- my_claude_code/providers/chatgpt_oauth/codex_catalogue.py +551 -0
- my_claude_code/providers/chatgpt_oauth/conversion.py +67 -0
- my_claude_code/providers/chatgpt_oauth/credentials.py +600 -0
- my_claude_code/providers/chatgpt_oauth/oauth_login.py +316 -0
- my_claude_code/providers/chatgpt_oauth/provider.py +827 -0
- my_claude_code/providers/chatgpt_oauth/response_headers.py +128 -0
- my_claude_code/providers/chatgpt_oauth/streaming.py +25 -0
- my_claude_code/providers/cloudflare/__init__.py +8 -0
- my_claude_code/providers/cloudflare/client.py +150 -0
- my_claude_code/providers/commandcode/__init__.py +10 -0
- my_claude_code/providers/commandcode/client.py +175 -0
- my_claude_code/providers/commandcode/models.py +67 -0
- my_claude_code/providers/credential_rotation.py +546 -0
- my_claude_code/providers/deepseek/__init__.py +5 -0
- my_claude_code/providers/deepseek/client.py +129 -0
- my_claude_code/providers/deepseek/compat.py +376 -0
- my_claude_code/providers/deepseek/tool_choice.py +72 -0
- my_claude_code/providers/failure_policy.py +842 -0
- my_claude_code/providers/gemini/__init__.py +5 -0
- my_claude_code/providers/gemini/client.py +91 -0
- my_claude_code/providers/gemini/quirks.py +161 -0
- my_claude_code/providers/github_models/__init__.py +5 -0
- my_claude_code/providers/github_models/client.py +142 -0
- my_claude_code/providers/google_openai/__init__.py +15 -0
- my_claude_code/providers/google_openai/provider.py +80 -0
- my_claude_code/providers/google_openai/reasoning.py +123 -0
- my_claude_code/providers/google_openai/thought_signatures.py +117 -0
- my_claude_code/providers/http.py +51 -0
- my_claude_code/providers/kilo/__init__.py +5 -0
- my_claude_code/providers/kilo/client.py +27 -0
- my_claude_code/providers/lmstudio/__init__.py +5 -0
- my_claude_code/providers/lmstudio/client.py +132 -0
- my_claude_code/providers/mistral/__init__.py +5 -0
- my_claude_code/providers/mistral/client.py +110 -0
- my_claude_code/providers/mistral/reasoning.py +404 -0
- my_claude_code/providers/model_listing.py +589 -0
- my_claude_code/providers/nous_portal/__init__.py +5 -0
- my_claude_code/providers/nous_portal/client.py +65 -0
- my_claude_code/providers/nvidia_nim/__init__.py +5 -0
- my_claude_code/providers/nvidia_nim/client.py +240 -0
- my_claude_code/providers/nvidia_nim/request_options.py +151 -0
- my_claude_code/providers/nvidia_nim/retry.py +112 -0
- my_claude_code/providers/nvidia_nim/tool_schema.py +255 -0
- my_claude_code/providers/nvidia_nim/voice.py +113 -0
- my_claude_code/providers/open_router/__init__.py +5 -0
- my_claude_code/providers/open_router/client.py +22 -0
- my_claude_code/providers/openai_chat/__init__.py +113 -0
- my_claude_code/providers/openai_chat/base_url.py +7 -0
- my_claude_code/providers/openai_chat/chunks.py +357 -0
- my_claude_code/providers/openai_chat/client_identity.py +262 -0
- my_claude_code/providers/openai_chat/complaint.py +26 -0
- my_claude_code/providers/openai_chat/extra_body.py +60 -0
- my_claude_code/providers/openai_chat/identity_enforcement.py +169 -0
- my_claude_code/providers/openai_chat/learned_dialect.py +164 -0
- my_claude_code/providers/openai_chat/messages_transport.py +201 -0
- my_claude_code/providers/openai_chat/opencode_identity.py +342 -0
- my_claude_code/providers/openai_chat/output_cap.py +17 -0
- my_claude_code/providers/openai_chat/profiles.py +954 -0
- my_claude_code/providers/openai_chat/provider.py +1644 -0
- my_claude_code/providers/openai_chat/reasoning.py +337 -0
- my_claude_code/providers/openai_chat/reasoning_details.py +174 -0
- my_claude_code/providers/openai_chat/reasoning_reject.py +16 -0
- my_claude_code/providers/openai_chat/request_policy.py +231 -0
- my_claude_code/providers/openai_chat/response_surface.py +292 -0
- my_claude_code/providers/openai_chat/responses_transport.py +329 -0
- my_claude_code/providers/openai_chat/tool_calls.py +295 -0
- my_claude_code/providers/openai_chat/usage.py +114 -0
- my_claude_code/providers/openai_responses/__init__.py +32 -0
- my_claude_code/providers/openai_responses/conversion.py +382 -0
- my_claude_code/providers/openai_responses/streaming.py +426 -0
- my_claude_code/providers/openrouter_gateway.py +218 -0
- my_claude_code/providers/rate_limit.py +400 -0
- my_claude_code/providers/recovery/__init__.py +141 -0
- my_claude_code/providers/recovery/complaint.py +190 -0
- my_claude_code/providers/recovery/facts.py +386 -0
- my_claude_code/providers/recovery/ladder.py +264 -0
- my_claude_code/providers/recovery/memory.py +161 -0
- my_claude_code/providers/recovery/output_cap.py +118 -0
- my_claude_code/providers/recovery/reasoning_reject.py +146 -0
- my_claude_code/providers/recovery/store.py +569 -0
- my_claude_code/providers/recovery/surface.py +107 -0
- my_claude_code/providers/runtime/__init__.py +11 -0
- my_claude_code/providers/runtime/capability_probes.py +359 -0
- my_claude_code/providers/runtime/config.py +178 -0
- my_claude_code/providers/runtime/discovery.py +313 -0
- my_claude_code/providers/runtime/factory.py +355 -0
- my_claude_code/providers/runtime/identity_probe.py +229 -0
- my_claude_code/providers/runtime/litellm_prices.py +411 -0
- my_claude_code/providers/runtime/model_cache.py +237 -0
- my_claude_code/providers/runtime/models_dev.py +2206 -0
- my_claude_code/providers/runtime/reasoning_probe.py +155 -0
- my_claude_code/providers/runtime/rotating.py +420 -0
- my_claude_code/providers/runtime/runtime.py +48 -0
- my_claude_code/providers/runtime/served_models.py +137 -0
- my_claude_code/providers/runtime/validation.py +132 -0
- my_claude_code/providers/stream_recovery.py +364 -0
- my_claude_code/providers/vertex/__init__.py +5 -0
- my_claude_code/providers/vertex/auth.py +105 -0
- my_claude_code/providers/vertex/client.py +134 -0
- my_claude_code/providers/vertex/endpoint.py +50 -0
- my_claude_code/providers/vertex/models.py +52 -0
- my_claude_code/runtime/__init__.py +1 -0
- my_claude_code/runtime/application.py +1050 -0
- my_claude_code/runtime/asgi.py +525 -0
- my_claude_code/runtime/bootstrap.py +72 -0
- my_claude_code/runtime/catalogue_store.py +203 -0
- my_claude_code/runtime/discovery_timer.py +239 -0
- my_claude_code/runtime/harness_catalogues.py +345 -0
- my_claude_code/runtime/provider_manager.py +982 -0
- my_claude_code/runtime/warmup.py +149 -0
- my_claude_code/websearch/__init__.py +52 -0
- my_claude_code/websearch/adapters/__init__.py +37 -0
- my_claude_code/websearch/adapters/brave.py +160 -0
- my_claude_code/websearch/adapters/ddgs.py +88 -0
- my_claude_code/websearch/adapters/exa.py +133 -0
- my_claude_code/websearch/adapters/firecrawl.py +138 -0
- my_claude_code/websearch/adapters/http.py +154 -0
- my_claude_code/websearch/adapters/jina.py +91 -0
- my_claude_code/websearch/adapters/linkup.py +109 -0
- my_claude_code/websearch/adapters/ollama.py +79 -0
- my_claude_code/websearch/adapters/parallel.py +111 -0
- my_claude_code/websearch/adapters/perplexity.py +99 -0
- my_claude_code/websearch/adapters/searchapi.py +119 -0
- my_claude_code/websearch/adapters/searxng.py +97 -0
- my_claude_code/websearch/adapters/serpapi.py +119 -0
- my_claude_code/websearch/adapters/serper.py +124 -0
- my_claude_code/websearch/adapters/tavily.py +113 -0
- my_claude_code/websearch/analytics.py +1407 -0
- my_claude_code/websearch/base.py +157 -0
- my_claude_code/websearch/errors.py +79 -0
- my_claude_code/websearch/options.py +69 -0
- my_claude_code/websearch/registry.py +534 -0
- my_claude_code/websearch/rotation.py +253 -0
- my_claude_code-7.13.1.dist-info/METADATA +423 -0
- my_claude_code-7.13.1.dist-info/RECORD +567 -0
- my_claude_code-7.13.1.dist-info/WHEEL +4 -0
- my_claude_code-7.13.1.dist-info/entry_points.txt +44 -0
- my_claude_code-7.13.1.dist-info/licenses/COMMERCIAL-LICENSE.md +55 -0
- my_claude_code-7.13.1.dist-info/licenses/LICENSE +748 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""My Claude Code package."""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""HTTP API adapter for Free Claude Code."""
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""Admin response cache policy."""
|
|
2
|
+
|
|
3
|
+
from fastapi import Response
|
|
4
|
+
from starlette.datastructures import MutableHeaders
|
|
5
|
+
from starlette.types import ASGIApp, Message, Receive, Scope, Send
|
|
6
|
+
|
|
7
|
+
_ADMIN_CACHE_CONTROL = "no-store"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class AdminNoStoreMiddleware:
|
|
11
|
+
"""Prevent browsers from retaining responses from the admin surface."""
|
|
12
|
+
|
|
13
|
+
def __init__(self, app: ASGIApp) -> None:
|
|
14
|
+
self._app = app
|
|
15
|
+
|
|
16
|
+
async def __call__(
|
|
17
|
+
self,
|
|
18
|
+
scope: Scope,
|
|
19
|
+
receive: Receive,
|
|
20
|
+
send: Send,
|
|
21
|
+
) -> None:
|
|
22
|
+
path = scope.get("path", "")
|
|
23
|
+
if scope["type"] != "http" or not _is_admin_path(path):
|
|
24
|
+
await self._app(scope, receive, send)
|
|
25
|
+
return
|
|
26
|
+
|
|
27
|
+
async def send_without_cache(message: Message) -> None:
|
|
28
|
+
if message["type"] == "http.response.start":
|
|
29
|
+
message = dict(message)
|
|
30
|
+
raw_headers = list(message.get("headers", ()))
|
|
31
|
+
_set_no_store(MutableHeaders(raw=raw_headers))
|
|
32
|
+
message["headers"] = raw_headers
|
|
33
|
+
await send(message)
|
|
34
|
+
|
|
35
|
+
await self._app(scope, receive, send_without_cache)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def attach_admin_no_store(response: Response, *, path: str) -> None:
|
|
39
|
+
"""Attach the policy when an outer server-error boundary bypasses middleware."""
|
|
40
|
+
if _is_admin_path(path):
|
|
41
|
+
_set_no_store(response.headers)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _is_admin_path(path: str) -> bool:
|
|
45
|
+
return path == "/admin" or path.startswith("/admin/")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _set_no_store(headers: MutableHeaders) -> None:
|
|
49
|
+
headers["Cache-Control"] = _ADMIN_CACHE_CONTROL
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"""Admin API for the Configure Claude Code settings editor.
|
|
2
|
+
|
|
3
|
+
Four routes, matching how the page works:
|
|
4
|
+
|
|
5
|
+
``GET /admin/api/claude-config/catalog`` what Claude Code can be configured to do
|
|
6
|
+
``GET /admin/api/claude-config/document`` what this machine's settings file says
|
|
7
|
+
``POST /admin/api/claude-config/plan`` what a set of edits would change
|
|
8
|
+
``POST /admin/api/claude-config/apply`` make those edits
|
|
9
|
+
|
|
10
|
+
Plan and apply are separate so the page can show a real diff before writing.
|
|
11
|
+
Apply re-plans server-side rather than trusting the diff the browser sends
|
|
12
|
+
back: the browser's copy is a rendering, not an authority, and a plan the user
|
|
13
|
+
looked at for a minute must not clobber a change made in the meantime.
|
|
14
|
+
|
|
15
|
+
Writes are confined to Claude Code settings files. Nothing here accepts an
|
|
16
|
+
arbitrary path, because an admin API that writes JSON anywhere on the box is a
|
|
17
|
+
different and much larger thing than a settings editor.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
from typing import Any
|
|
22
|
+
|
|
23
|
+
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
24
|
+
from pydantic import BaseModel, Field
|
|
25
|
+
|
|
26
|
+
from my_claude_code.config.claude_code_catalog import (
|
|
27
|
+
ClaudeCatalogError,
|
|
28
|
+
load_catalog,
|
|
29
|
+
)
|
|
30
|
+
from my_claude_code.config.claude_config_editor import (
|
|
31
|
+
ChangePlan,
|
|
32
|
+
ChangeRequest,
|
|
33
|
+
PlannedChange,
|
|
34
|
+
apply_plan,
|
|
35
|
+
load_document,
|
|
36
|
+
managed_overrides,
|
|
37
|
+
plan_changes,
|
|
38
|
+
read_values,
|
|
39
|
+
)
|
|
40
|
+
from my_claude_code.config.claude_discovery import discover_settings_files
|
|
41
|
+
from my_claude_code.config.claude_settings import ClaudeSettingsError
|
|
42
|
+
from my_claude_code.config.paths import claude_settings_path
|
|
43
|
+
|
|
44
|
+
from .admin_routes import require_loopback_admin
|
|
45
|
+
|
|
46
|
+
router = APIRouter()
|
|
47
|
+
|
|
48
|
+
CLAUDE_SETTINGS_FILENAMES = ("settings.json", "settings.local.json")
|
|
49
|
+
CLAUDE_DIRNAME = ".claude"
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class ChangePayload(BaseModel):
|
|
53
|
+
"""One requested edit, as the page sends it."""
|
|
54
|
+
|
|
55
|
+
name: str = Field(min_length=1, max_length=200)
|
|
56
|
+
op: str = Field(pattern="^(set|unset)$")
|
|
57
|
+
value: Any = None
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class PlanPayload(BaseModel):
|
|
61
|
+
"""A set of edits against one settings file."""
|
|
62
|
+
|
|
63
|
+
path: str | None = None
|
|
64
|
+
changes: list[ChangePayload] = Field(default_factory=list, max_length=200)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _resolve_target(raw_path: str | None) -> Path:
|
|
68
|
+
"""Return the settings file to act on, refusing anything that is not one.
|
|
69
|
+
|
|
70
|
+
The page offers the user file by default and a typed path for a project's
|
|
71
|
+
``.claude/settings.json``. Both shapes are checked here rather than trusted,
|
|
72
|
+
so a crafted request cannot turn this into a general file writer.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
if raw_path is None or not raw_path.strip():
|
|
76
|
+
return claude_settings_path()
|
|
77
|
+
|
|
78
|
+
candidate = Path(raw_path.strip()).expanduser()
|
|
79
|
+
if not candidate.is_absolute():
|
|
80
|
+
raise HTTPException(status_code=400, detail="path must be absolute")
|
|
81
|
+
|
|
82
|
+
if candidate.name not in CLAUDE_SETTINGS_FILENAMES:
|
|
83
|
+
raise HTTPException(
|
|
84
|
+
status_code=400,
|
|
85
|
+
detail=(
|
|
86
|
+
"path must name a Claude Code settings file "
|
|
87
|
+
f"({' or '.join(CLAUDE_SETTINGS_FILENAMES)})"
|
|
88
|
+
),
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
if candidate.parent.name != CLAUDE_DIRNAME:
|
|
92
|
+
raise HTTPException(
|
|
93
|
+
status_code=400,
|
|
94
|
+
detail=f"path must sit inside a {CLAUDE_DIRNAME}/ directory",
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
return candidate.absolute()
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _plan_for(payload: PlanPayload) -> tuple[Path, ChangePlan]:
|
|
101
|
+
target = _resolve_target(payload.path)
|
|
102
|
+
document = load_document(target)
|
|
103
|
+
|
|
104
|
+
requests = [
|
|
105
|
+
ChangeRequest(
|
|
106
|
+
name=change.name,
|
|
107
|
+
op="unset" if change.op == "unset" else "set",
|
|
108
|
+
value=change.value,
|
|
109
|
+
)
|
|
110
|
+
for change in payload.changes
|
|
111
|
+
]
|
|
112
|
+
|
|
113
|
+
try:
|
|
114
|
+
plan = plan_changes(document, requests)
|
|
115
|
+
except ClaudeSettingsError as exc:
|
|
116
|
+
raise HTTPException(status_code=409, detail=str(exc)) from exc
|
|
117
|
+
|
|
118
|
+
return target, plan
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _plan_response(plan: ChangePlan) -> dict[str, Any]:
|
|
122
|
+
payload = plan.as_dict()
|
|
123
|
+
payload["managed_overrides"] = managed_overrides(
|
|
124
|
+
[change.name for change in plan.effective]
|
|
125
|
+
)
|
|
126
|
+
return payload
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
@router.get("/admin/api/claude-config/catalog")
|
|
130
|
+
async def get_claude_config_catalog(
|
|
131
|
+
_: None = Depends(require_loopback_admin),
|
|
132
|
+
) -> dict[str, Any]:
|
|
133
|
+
"""Return every configurable Claude Code value and the control it wants."""
|
|
134
|
+
|
|
135
|
+
try:
|
|
136
|
+
catalog = load_catalog()
|
|
137
|
+
except ClaudeCatalogError as exc:
|
|
138
|
+
raise HTTPException(status_code=500, detail=str(exc)) from exc
|
|
139
|
+
|
|
140
|
+
payload = catalog.as_dict()
|
|
141
|
+
payload["categories"] = list(catalog.categories())
|
|
142
|
+
return payload
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
@router.get("/admin/api/claude-config/document")
|
|
146
|
+
async def get_claude_config_document(
|
|
147
|
+
path: str | None = Query(default=None),
|
|
148
|
+
_: None = Depends(require_loopback_admin),
|
|
149
|
+
) -> dict[str, Any]:
|
|
150
|
+
"""Return the current contents of one settings file, secrets masked."""
|
|
151
|
+
|
|
152
|
+
target = _resolve_target(path)
|
|
153
|
+
document = load_document(target)
|
|
154
|
+
values = read_values(document) if document.parsed else {}
|
|
155
|
+
|
|
156
|
+
return {
|
|
157
|
+
"path": document.path,
|
|
158
|
+
"exists": document.exists,
|
|
159
|
+
"parsed": document.parsed,
|
|
160
|
+
"error": document.error,
|
|
161
|
+
"is_default": target == claude_settings_path(),
|
|
162
|
+
"default_path": str(claude_settings_path()),
|
|
163
|
+
"candidates": [entry.path for entry in discover_settings_files()],
|
|
164
|
+
"values": values,
|
|
165
|
+
"managed_overrides": managed_overrides(sorted(values)),
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
@router.post("/admin/api/claude-config/plan")
|
|
170
|
+
async def plan_claude_config(
|
|
171
|
+
payload: PlanPayload,
|
|
172
|
+
_: None = Depends(require_loopback_admin),
|
|
173
|
+
) -> dict[str, Any]:
|
|
174
|
+
"""Resolve edits into a reviewable diff without touching disk."""
|
|
175
|
+
|
|
176
|
+
_target, plan = _plan_for(payload)
|
|
177
|
+
return _plan_response(plan)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
@router.post("/admin/api/claude-config/apply")
|
|
181
|
+
async def apply_claude_config(
|
|
182
|
+
payload: PlanPayload,
|
|
183
|
+
_: None = Depends(require_loopback_admin),
|
|
184
|
+
) -> dict[str, Any]:
|
|
185
|
+
"""Re-plan the edits server-side, then write them."""
|
|
186
|
+
|
|
187
|
+
target, plan = _plan_for(payload)
|
|
188
|
+
|
|
189
|
+
if not plan.effective:
|
|
190
|
+
document = load_document(target)
|
|
191
|
+
return {
|
|
192
|
+
"applied": [],
|
|
193
|
+
"plan": _plan_response(plan),
|
|
194
|
+
"values": read_values(document),
|
|
195
|
+
"path": document.path,
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
try:
|
|
199
|
+
document = apply_plan(plan)
|
|
200
|
+
except ClaudeSettingsError as exc:
|
|
201
|
+
raise HTTPException(status_code=409, detail=str(exc)) from exc
|
|
202
|
+
|
|
203
|
+
return {
|
|
204
|
+
"applied": [_applied(change) for change in plan.effective],
|
|
205
|
+
"plan": _plan_response(plan),
|
|
206
|
+
"values": read_values(document),
|
|
207
|
+
"path": document.path,
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def _applied(change: PlannedChange) -> dict[str, Any]:
|
|
212
|
+
return {"name": change.name, "op": change.op}
|