iCode-TUI 0.29.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.
- chrys/__init__.py +16 -0
- chrys/app/__init__.py +3 -0
- chrys/app/acp/__init__.py +3 -0
- chrys/app/acp/bridge.py +664 -0
- chrys/app/acp/content.py +132 -0
- chrys/app/acp/doc/frontend-api.md +425 -0
- chrys/app/acp/history.py +585 -0
- chrys/app/acp/server.py +1796 -0
- chrys/app/acp/session_manager.py +1815 -0
- chrys/app/acp/tool_status.py +45 -0
- chrys/app/cli/__init__.py +3 -0
- chrys/app/cli/acp.py +178 -0
- chrys/app/cli/app.py +165 -0
- chrys/app/cli/approvals.py +101 -0
- chrys/app/cli/headless.py +223 -0
- chrys/app/cli/launch_cwd.py +42 -0
- chrys/app/cli/profiles.py +298 -0
- chrys/app/cli/progress.py +857 -0
- chrys/app/cli/run.py +425 -0
- chrys/app/cli/serve.py +1593 -0
- chrys/app/cli/tool_summary.py +225 -0
- chrys/app/cli/trajectory.py +201 -0
- chrys/app/cli/workflow.py +601 -0
- chrys/app/features/__init__.py +3 -0
- chrys/app/features/buddy/__init__.py +3 -0
- chrys/app/features/buddy/actions.py +68 -0
- chrys/app/features/buddy/animation.py +76 -0
- chrys/app/features/buddy/commands.py +196 -0
- chrys/app/features/buddy/docs/design.md +187 -0
- chrys/app/features/buddy/hatchery.py +80 -0
- chrys/app/features/buddy/lifecycle.py +41 -0
- chrys/app/features/buddy/model.py +265 -0
- chrys/app/features/buddy/pixel_renderer.py +113 -0
- chrys/app/features/buddy/pixel_sprites.py +279 -0
- chrys/app/features/buddy/portrait.py +76 -0
- chrys/app/features/buddy/progression.py +58 -0
- chrys/app/features/buddy/replies.py +191 -0
- chrys/app/features/buddy/sprites/alien.toml +70 -0
- chrys/app/features/buddy/sprites/axolotl.toml +71 -0
- chrys/app/features/buddy/sprites/bat.toml +69 -0
- chrys/app/features/buddy/sprites/bee.toml +69 -0
- chrys/app/features/buddy/sprites/cactus.toml +73 -0
- chrys/app/features/buddy/sprites/capybara.toml +70 -0
- chrys/app/features/buddy/sprites/cat.toml +69 -0
- chrys/app/features/buddy/sprites/crab.toml +70 -0
- chrys/app/features/buddy/sprites/dragon.toml +71 -0
- chrys/app/features/buddy/sprites/duck.toml +69 -0
- chrys/app/features/buddy/sprites/fox.toml +69 -0
- chrys/app/features/buddy/sprites/frog.toml +70 -0
- chrys/app/features/buddy/sprites/ghost.toml +70 -0
- chrys/app/features/buddy/sprites/goose.toml +69 -0
- chrys/app/features/buddy/sprites/jelly.toml +70 -0
- chrys/app/features/buddy/sprites/llama.toml +70 -0
- chrys/app/features/buddy/sprites/mushroom.toml +69 -0
- chrys/app/features/buddy/sprites/octopus.toml +70 -0
- chrys/app/features/buddy/sprites/owl.toml +70 -0
- chrys/app/features/buddy/sprites/panda.toml +71 -0
- chrys/app/features/buddy/sprites/penguin.toml +69 -0
- chrys/app/features/buddy/sprites/rabbit.toml +70 -0
- chrys/app/features/buddy/sprites/robot.toml +72 -0
- chrys/app/features/buddy/sprites/shark.toml +70 -0
- chrys/app/features/buddy/sprites/snail.toml +69 -0
- chrys/app/features/buddy/sprites/snake.toml +69 -0
- chrys/app/features/buddy/sprites/tabby.toml +69 -0
- chrys/app/features/buddy/sprites/turtle.toml +69 -0
- chrys/app/features/buddy/store.py +143 -0
- chrys/app/features/session_title/__init__.py +7 -0
- chrys/app/features/session_title/updater.py +582 -0
- chrys/app/installer.py +651 -0
- chrys/app/parsing.py +17 -0
- chrys/app/tui/__init__.py +3 -0
- chrys/app/tui/app.py +1287 -0
- chrys/app/tui/behaviors/__init__.py +3 -0
- chrys/app/tui/behaviors/click_outside_dismiss.py +90 -0
- chrys/app/tui/behaviors/insert_clipboard.py +73 -0
- chrys/app/tui/behaviors/right_click_copy.py +146 -0
- chrys/app/tui/binding_display.py +139 -0
- chrys/app/tui/buddy_messages.py +17 -0
- chrys/app/tui/buddy_reply.py +86 -0
- chrys/app/tui/chrys.tcss +549 -0
- chrys/app/tui/clipboard.py +109 -0
- chrys/app/tui/copy_messages.py +10 -0
- chrys/app/tui/i18n.py +230 -0
- chrys/app/tui/language.py +58 -0
- chrys/app/tui/notifications/__init__.py +12 -0
- chrys/app/tui/notifications/drivers.py +180 -0
- chrys/app/tui/notifications/service.py +126 -0
- chrys/app/tui/notifications/settings.py +141 -0
- chrys/app/tui/screens/__init__.py +3 -0
- chrys/app/tui/screens/agents/__init__.py +8 -0
- chrys/app/tui/screens/agents/agent_draft_store.py +937 -0
- chrys/app/tui/screens/agents/config.py +2142 -0
- chrys/app/tui/screens/agents/config.tcss +169 -0
- chrys/app/tui/screens/agents/panels/__init__.py +3 -0
- chrys/app/tui/screens/agents/panels/acp.py +1176 -0
- chrys/app/tui/screens/agents/panels/basic.py +497 -0
- chrys/app/tui/screens/agents/panels/compaction.py +231 -0
- chrys/app/tui/screens/agents/panels/config_card.py +218 -0
- chrys/app/tui/screens/agents/panels/instructions.py +91 -0
- chrys/app/tui/screens/agents/panels/markdown_report.py +76 -0
- chrys/app/tui/screens/agents/panels/mcp.py +2262 -0
- chrys/app/tui/screens/agents/panels/memory.py +684 -0
- chrys/app/tui/screens/agents/panels/path_entry.py +227 -0
- chrys/app/tui/screens/agents/panels/skills.py +806 -0
- chrys/app/tui/screens/agents/panels/subagents.py +652 -0
- chrys/app/tui/screens/agents/panels/tools.py +205 -0
- chrys/app/tui/screens/agents/picker.py +103 -0
- chrys/app/tui/screens/agents/skill_paths.py +38 -0
- chrys/app/tui/screens/agents/validation_messages.py +452 -0
- chrys/app/tui/screens/dialogs/__init__.py +35 -0
- chrys/app/tui/screens/dialogs/agent_load.py +834 -0
- chrys/app/tui/screens/dialogs/agent_load.tcss +78 -0
- chrys/app/tui/screens/dialogs/app_mode.py +55 -0
- chrys/app/tui/screens/dialogs/approval/__init__.py +15 -0
- chrys/app/tui/screens/dialogs/approval/approval.tcss +311 -0
- chrys/app/tui/screens/dialogs/approval/bodies/__init__.py +3 -0
- chrys/app/tui/screens/dialogs/approval/bodies/file_edit.py +210 -0
- chrys/app/tui/screens/dialogs/approval/bodies/sub_agent.py +82 -0
- chrys/app/tui/screens/dialogs/approval/body.py +110 -0
- chrys/app/tui/screens/dialogs/approval/dialog.py +565 -0
- chrys/app/tui/screens/dialogs/approval/mode.py +105 -0
- chrys/app/tui/screens/dialogs/ask_user.py +148 -0
- chrys/app/tui/screens/dialogs/ask_user.tcss +62 -0
- chrys/app/tui/screens/dialogs/base.py +84 -0
- chrys/app/tui/screens/dialogs/confirm.py +184 -0
- chrys/app/tui/screens/dialogs/confirm.tcss +46 -0
- chrys/app/tui/screens/dialogs/connection_test.py +183 -0
- chrys/app/tui/screens/dialogs/connection_test.tcss +92 -0
- chrys/app/tui/screens/dialogs/diagram.py +102 -0
- chrys/app/tui/screens/dialogs/diagram.tcss +24 -0
- chrys/app/tui/screens/dialogs/editor.py +378 -0
- chrys/app/tui/screens/dialogs/editor.tcss +132 -0
- chrys/app/tui/screens/dialogs/file_picker.py +582 -0
- chrys/app/tui/screens/dialogs/file_picker.tcss +78 -0
- chrys/app/tui/screens/dialogs/fork_session.py +219 -0
- chrys/app/tui/screens/dialogs/fork_session.tcss +75 -0
- chrys/app/tui/screens/dialogs/image_compression.py +102 -0
- chrys/app/tui/screens/dialogs/image_compression.tcss +28 -0
- chrys/app/tui/screens/dialogs/man_page.py +172 -0
- chrys/app/tui/screens/dialogs/man_page.tcss +39 -0
- chrys/app/tui/screens/dialogs/new_folder.py +277 -0
- chrys/app/tui/screens/dialogs/new_folder.tcss +51 -0
- chrys/app/tui/screens/dialogs/notice.tcss +14 -0
- chrys/app/tui/screens/dialogs/prompt_cache.py +144 -0
- chrys/app/tui/screens/dialogs/prompt_cache.tcss +38 -0
- chrys/app/tui/screens/dialogs/runtime_details.py +371 -0
- chrys/app/tui/screens/dialogs/runtime_details.tcss +49 -0
- chrys/app/tui/screens/dialogs/session_title.py +110 -0
- chrys/app/tui/screens/dialogs/session_title.tcss +43 -0
- chrys/app/tui/screens/dialogs/tool_view.py +207 -0
- chrys/app/tui/screens/dialogs/tool_view.tcss +43 -0
- chrys/app/tui/screens/dialogs/vision_unsupported.py +122 -0
- chrys/app/tui/screens/dialogs/vision_unsupported.tcss +35 -0
- chrys/app/tui/screens/dialogs/workflow_confirm.py +91 -0
- chrys/app/tui/screens/dialogs/workflow_confirm.tcss +17 -0
- chrys/app/tui/screens/dialogs/workflow_input.py +258 -0
- chrys/app/tui/screens/dialogs/workflow_input.tcss +73 -0
- chrys/app/tui/screens/dialogs/workflow_node.py +462 -0
- chrys/app/tui/screens/dialogs/workflow_node.tcss +41 -0
- chrys/app/tui/screens/dialogs/workflow_picker.py +46 -0
- chrys/app/tui/screens/dialogs/workflow_result.py +136 -0
- chrys/app/tui/screens/dialogs/workflow_result.tcss +14 -0
- chrys/app/tui/screens/diff/__init__.py +22 -0
- chrys/app/tui/screens/diff/rollback_modal.py +1381 -0
- chrys/app/tui/screens/diff/rollback_modal.tcss +248 -0
- chrys/app/tui/screens/diff/screen.py +1532 -0
- chrys/app/tui/screens/diff/screen.tcss +104 -0
- chrys/app/tui/screens/guides/__init__.py +7 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/agents.md +178 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/approval.md +117 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/chat-options.md +276 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/compaction.md +42 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/memory.md +48 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/models.md +158 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/settings.md +210 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/themes.md +61 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/tools.md +60 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/web-tools.md +286 -0
- chrys/app/tui/screens/guides/_docs/en/guides/daily-use/sessions.md +77 -0
- chrys/app/tui/screens/guides/_docs/en/guides/daily-use/workspaces.md +51 -0
- chrys/app/tui/screens/guides/_docs/en/guides/extensions/external-acp-agents.md +126 -0
- chrys/app/tui/screens/guides/_docs/en/guides/extensions/hooks.md +167 -0
- chrys/app/tui/screens/guides/_docs/en/guides/extensions/mcp.md +95 -0
- chrys/app/tui/screens/guides/_docs/en/guides/extensions/skills.md +175 -0
- chrys/app/tui/screens/guides/_docs/en/guides/running/icode-acp.md +61 -0
- chrys/app/tui/screens/guides/_docs/en/guides/running/icode-run.md +190 -0
- chrys/app/tui/screens/guides/_docs/en/guides/running/icode-serve.md +239 -0
- chrys/app/tui/screens/guides/_docs/en/guides/running/workflows.md +664 -0
- chrys/app/tui/screens/guides/_docs/en/reference/agent-profile.md +548 -0
- chrys/app/tui/screens/guides/_docs/en/reference/hooks.md +602 -0
- chrys/app/tui/screens/guides/_docs/en/reference/opentelemetry.md +177 -0
- chrys/app/tui/screens/guides/_docs/en/reference/settings.md +245 -0
- chrys/app/tui/screens/guides/_docs/en/reference/themes.md +149 -0
- chrys/app/tui/screens/guides/_docs/en/reference/tool-kinds-and-names.md +58 -0
- chrys/app/tui/screens/guides/_docs/en/reference/tui-slash-commands.md +76 -0
- chrys/app/tui/screens/guides/_docs/en/reference/workflows.md +1006 -0
- chrys/app/tui/screens/guides/_docs/en/start/getting-started.md +170 -0
- chrys/app/tui/screens/guides/_docs/en/start/what-is-icode.md +34 -0
- chrys/app/tui/screens/guides/_docs/index.yaml +100 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/agents.md +178 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/approval.md +117 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/chat-options.md +276 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/compaction.md +42 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/memory.md +48 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/models.md +158 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/settings.md +210 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/themes.md +61 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/tools.md +60 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/web-tools.md +286 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/daily-use/sessions.md +77 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/daily-use/workspaces.md +51 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/extensions/external-acp-agents.md +126 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/extensions/hooks.md +167 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/extensions/mcp.md +95 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/extensions/skills.md +175 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/running/icode-acp.md +61 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/running/icode-run.md +190 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/running/icode-serve.md +239 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/running/workflows.md +664 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/agent-profile.md +548 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/hooks.md +602 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/opentelemetry.md +177 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/settings.md +245 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/themes.md +149 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/tool-kinds-and-names.md +58 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/tui-slash-commands.md +76 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/workflows.md +1005 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/start/getting-started.md +170 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/start/what-is-icode.md +34 -0
- chrys/app/tui/screens/guides/index.py +215 -0
- chrys/app/tui/screens/guides/reader.py +173 -0
- chrys/app/tui/screens/guides/screen.py +442 -0
- chrys/app/tui/screens/guides/screen.tcss +52 -0
- chrys/app/tui/screens/logs/__init__.py +7 -0
- chrys/app/tui/screens/logs/screen.py +504 -0
- chrys/app/tui/screens/logs/screen.tcss +45 -0
- chrys/app/tui/screens/main/__init__.py +7 -0
- chrys/app/tui/screens/main/action_availability.py +30 -0
- chrys/app/tui/screens/main/buddy_command.py +143 -0
- chrys/app/tui/screens/main/commands.py +1073 -0
- chrys/app/tui/screens/main/config_actions.py +464 -0
- chrys/app/tui/screens/main/copy_actions.py +117 -0
- chrys/app/tui/screens/main/dialog_controllers.py +826 -0
- chrys/app/tui/screens/main/dialog_gateway.py +166 -0
- chrys/app/tui/screens/main/diff_controller.py +478 -0
- chrys/app/tui/screens/main/engine_read_model.py +184 -0
- chrys/app/tui/screens/main/event_handlers.py +2014 -0
- chrys/app/tui/screens/main/input_flow.py +241 -0
- chrys/app/tui/screens/main/live_diff.py +244 -0
- chrys/app/tui/screens/main/main_screen_presenter.py +295 -0
- chrys/app/tui/screens/main/model_indicator.py +217 -0
- chrys/app/tui/screens/main/navigation.py +343 -0
- chrys/app/tui/screens/main/ports.py +571 -0
- chrys/app/tui/screens/main/recent_dirs.py +123 -0
- chrys/app/tui/screens/main/rollback_controller.py +586 -0
- chrys/app/tui/screens/main/runtime_info.py +71 -0
- chrys/app/tui/screens/main/screen.py +2265 -0
- chrys/app/tui/screens/main/screen.tcss +21 -0
- chrys/app/tui/screens/main/session_handlers.py +1127 -0
- chrys/app/tui/screens/main/session_title.py +239 -0
- chrys/app/tui/screens/main/settings_coordinator.py +365 -0
- chrys/app/tui/screens/main/settings_persistence.py +184 -0
- chrys/app/tui/screens/main/shell_mode.py +112 -0
- chrys/app/tui/screens/main/state.py +289 -0
- chrys/app/tui/screens/main/submit_state.py +11 -0
- chrys/app/tui/screens/main/subscriptions.py +177 -0
- chrys/app/tui/screens/main/suggestions.py +982 -0
- chrys/app/tui/screens/main/tool_action_bridge.py +75 -0
- chrys/app/tui/screens/main/view_adapter.py +1567 -0
- chrys/app/tui/screens/main/workflow_browser.py +747 -0
- chrys/app/tui/screens/main/workflow_content.py +248 -0
- chrys/app/tui/screens/main/workflow_controller.py +240 -0
- chrys/app/tui/screens/main/workflow_feedback.py +137 -0
- chrys/app/tui/screens/main/workflow_flow.py +49 -0
- chrys/app/tui/screens/main/workflow_run_control.py +456 -0
- chrys/app/tui/screens/main/workflow_session_view.py +316 -0
- chrys/app/tui/screens/main/workspace_actions.py +272 -0
- chrys/app/tui/screens/main/workspace_branch.py +194 -0
- chrys/app/tui/screens/menus/__init__.py +8 -0
- chrys/app/tui/screens/menus/languages.py +114 -0
- chrys/app/tui/screens/models/__init__.py +7 -0
- chrys/app/tui/screens/models/picker.py +147 -0
- chrys/app/tui/screens/models/screen.py +2043 -0
- chrys/app/tui/screens/models/screen.tcss +255 -0
- chrys/app/tui/screens/sessions/__init__.py +8 -0
- chrys/app/tui/screens/sessions/presenter.py +586 -0
- chrys/app/tui/screens/sessions/screen.py +779 -0
- chrys/app/tui/screens/sessions/screen.tcss +127 -0
- chrys/app/tui/screens/settings/__init__.py +29 -0
- chrys/app/tui/screens/settings/danger.py +26 -0
- chrys/app/tui/screens/settings/dialog.py +281 -0
- chrys/app/tui/screens/settings/layout.py +519 -0
- chrys/app/tui/screens/settings/migrate_dialog.py +253 -0
- chrys/app/tui/screens/settings/panes/__init__.py +3 -0
- chrys/app/tui/screens/settings/panes/notifications.py +248 -0
- chrys/app/tui/screens/settings/panes/sessions.py +148 -0
- chrys/app/tui/screens/settings/ports.py +55 -0
- chrys/app/tui/screens/settings/provenance.py +102 -0
- chrys/app/tui/screens/settings/rows.py +546 -0
- chrys/app/tui/screens/settings/settings.tcss +406 -0
- chrys/app/tui/screens/themes/__init__.py +8 -0
- chrys/app/tui/screens/themes/dialogs.py +330 -0
- chrys/app/tui/screens/themes/editor.py +632 -0
- chrys/app/tui/screens/themes/editor.tcss +268 -0
- chrys/app/tui/screens/themes/messages.py +95 -0
- chrys/app/tui/screens/themes/palette.py +694 -0
- chrys/app/tui/screens/themes/panel.py +113 -0
- chrys/app/tui/screens/themes/picker.py +203 -0
- chrys/app/tui/screens/themes/save.py +191 -0
- chrys/app/tui/support/__init__.py +3 -0
- chrys/app/tui/support/file_manager.py +64 -0
- chrys/app/tui/support/gc_freeze.py +1114 -0
- chrys/app/tui/support/path_shortcuts.py +50 -0
- chrys/app/tui/support/prompt_history.py +298 -0
- chrys/app/tui/support/workspace_mru.py +476 -0
- chrys/app/tui/terminal/__init__.py +6 -0
- chrys/app/tui/terminal/_pty_backend.py +114 -0
- chrys/app/tui/terminal/emulator/__init__.py +24 -0
- chrys/app/tui/terminal/emulator/buffer.py +456 -0
- chrys/app/tui/terminal/emulator/charsets.py +113 -0
- chrys/app/tui/terminal/emulator/core.py +963 -0
- chrys/app/tui/terminal/emulator/input.py +342 -0
- chrys/app/tui/terminal/emulator/parser.py +227 -0
- chrys/app/tui/terminal/emulator/pen.py +158 -0
- chrys/app/tui/terminal/launcher.py +455 -0
- chrys/app/tui/terminal/leaked_reports.py +44 -0
- chrys/app/tui/terminal/panel.py +323 -0
- chrys/app/tui/terminal/pty_process.py +405 -0
- chrys/app/tui/terminal/rendering.py +151 -0
- chrys/app/tui/terminal/shell.py +273 -0
- chrys/app/tui/terminal/shell_integration.py +199 -0
- chrys/app/tui/terminal/title.py +224 -0
- chrys/app/tui/terminal/widget.py +654 -0
- chrys/app/tui/theme.py +422 -0
- chrys/app/tui/theme_loader.py +201 -0
- chrys/app/tui/theme_stylesheet.py +49 -0
- chrys/app/tui/themes/__init__.py +3 -0
- chrys/app/tui/themes/document.py +120 -0
- chrys/app/tui/themes/preview.py +170 -0
- chrys/app/tui/themes/store.py +176 -0
- chrys/app/tui/toasts.py +69 -0
- chrys/app/tui/util/__init__.py +3 -0
- chrys/app/tui/util/context_pressure.py +146 -0
- chrys/app/tui/util/debug_log.py +292 -0
- chrys/app/tui/util/diff_entries.py +64 -0
- chrys/app/tui/util/formatting.py +53 -0
- chrys/app/tui/util/git_branch.py +326 -0
- chrys/app/tui/util/invocation_progress.py +57 -0
- chrys/app/tui/util/logo.py +32 -0
- chrys/app/tui/util/message_gate.py +35 -0
- chrys/app/tui/util/mutation_sources.py +14 -0
- chrys/app/tui/util/picker_text.py +27 -0
- chrys/app/tui/util/removal.py +47 -0
- chrys/app/tui/util/rich_style.py +36 -0
- chrys/app/tui/util/source_text.py +12 -0
- chrys/app/tui/util/static_update.py +88 -0
- chrys/app/tui/util/todo_format.py +51 -0
- chrys/app/tui/util/visibility.py +214 -0
- chrys/app/tui/widgets/__init__.py +60 -0
- chrys/app/tui/widgets/ask_user_controls.py +652 -0
- chrys/app/tui/widgets/ask_user_markdown.py +17 -0
- chrys/app/tui/widgets/ask_user_prompt.py +606 -0
- chrys/app/tui/widgets/buttons.py +52 -0
- chrys/app/tui/widgets/chat/__init__.py +3 -0
- chrys/app/tui/widgets/chat/agent_transcript_surface.py +818 -0
- chrys/app/tui/widgets/chat/chrome.py +296 -0
- chrys/app/tui/widgets/chat/compaction_card.py +353 -0
- chrys/app/tui/widgets/chat/context_fold.py +77 -0
- chrys/app/tui/widgets/chat/file_snapshot.py +91 -0
- chrys/app/tui/widgets/chat/image_preview.py +214 -0
- chrys/app/tui/widgets/chat/live_renderer.py +383 -0
- chrys/app/tui/widgets/chat/messages.py +1039 -0
- chrys/app/tui/widgets/chat/panel.py +1769 -0
- chrys/app/tui/widgets/chat/ports.py +245 -0
- chrys/app/tui/widgets/chat/renderers/__init__.py +7 -0
- chrys/app/tui/widgets/chat/renderers/ask_user.py +747 -0
- chrys/app/tui/widgets/chat/renderers/execute.py +431 -0
- chrys/app/tui/widgets/chat/renderers/file_edit.py +925 -0
- chrys/app/tui/widgets/chat/renderers/hosted_code.py +83 -0
- chrys/app/tui/widgets/chat/renderers/hosted_generic.py +330 -0
- chrys/app/tui/widgets/chat/renderers/hosted_image.py +107 -0
- chrys/app/tui/widgets/chat/renderers/hosted_mcp.py +43 -0
- chrys/app/tui/widgets/chat/renderers/hosted_search.py +167 -0
- chrys/app/tui/widgets/chat/renderers/hosted_shell.py +132 -0
- chrys/app/tui/widgets/chat/renderers/read_file.py +399 -0
- chrys/app/tui/widgets/chat/renderers/search.py +348 -0
- chrys/app/tui/widgets/chat/renderers/skill.py +564 -0
- chrys/app/tui/widgets/chat/renderers/sleep.py +287 -0
- chrys/app/tui/widgets/chat/renderers/sub_agent.py +1385 -0
- chrys/app/tui/widgets/chat/renderers/todo.py +114 -0
- chrys/app/tui/widgets/chat/renderers/web.py +69 -0
- chrys/app/tui/widgets/chat/replay.py +1605 -0
- chrys/app/tui/widgets/chat/replay_mount.py +322 -0
- chrys/app/tui/widgets/chat/scroll_controller.py +579 -0
- chrys/app/tui/widgets/chat/selection_controller.py +435 -0
- chrys/app/tui/widgets/chat/session_json.py +508 -0
- chrys/app/tui/widgets/chat/toc_model.py +156 -0
- chrys/app/tui/widgets/chat/tool_call.py +2478 -0
- chrys/app/tui/widgets/chat/tool_registry.py +753 -0
- chrys/app/tui/widgets/chat/tool_renderers.py +247 -0
- chrys/app/tui/widgets/chat/tool_view_builders.py +260 -0
- chrys/app/tui/widgets/chat/transcript_reader.py +57 -0
- chrys/app/tui/widgets/checkbox.py +24 -0
- chrys/app/tui/widgets/chrome/__init__.py +3 -0
- chrys/app/tui/widgets/chrome/app_header.py +283 -0
- chrys/app/tui/widgets/chrome/commands.py +95 -0
- chrys/app/tui/widgets/chrome/file_index.py +68 -0
- chrys/app/tui/widgets/chrome/file_scanner.py +670 -0
- chrys/app/tui/widgets/chrome/footer.py +284 -0
- chrys/app/tui/widgets/chrome/image_paste.py +351 -0
- chrys/app/tui/widgets/chrome/input_bar.py +1299 -0
- chrys/app/tui/widgets/chrome/status_bar.py +911 -0
- chrys/app/tui/widgets/chrome/suggestion_list.py +652 -0
- chrys/app/tui/widgets/click_affordance.py +24 -0
- chrys/app/tui/widgets/color_picker/__init__.py +254 -0
- chrys/app/tui/widgets/color_picker/controls.py +171 -0
- chrys/app/tui/widgets/color_picker/model.py +89 -0
- chrys/app/tui/widgets/dialog_buttons.py +58 -0
- chrys/app/tui/widgets/dialog_scroll.py +24 -0
- chrys/app/tui/widgets/diff_view/__init__.py +20 -0
- chrys/app/tui/widgets/diff_view/cells.py +59 -0
- chrys/app/tui/widgets/diff_view/code.py +280 -0
- chrys/app/tui/widgets/diff_view/compute.py +286 -0
- chrys/app/tui/widgets/diff_view/gutter.py +161 -0
- chrys/app/tui/widgets/diff_view/inline.py +77 -0
- chrys/app/tui/widgets/diff_view/palette.py +87 -0
- chrys/app/tui/widgets/diff_view/protocols.py +24 -0
- chrys/app/tui/widgets/diff_view/rows.py +138 -0
- chrys/app/tui/widgets/diff_view/unified.py +267 -0
- chrys/app/tui/widgets/diff_view/widget.py +209 -0
- chrys/app/tui/widgets/editor/__init__.py +79 -0
- chrys/app/tui/widgets/editor/coordinates.py +30 -0
- chrys/app/tui/widgets/editor/highlighter.py +139 -0
- chrys/app/tui/widgets/editor/keymaps.py +357 -0
- chrys/app/tui/widgets/editor/types.py +216 -0
- chrys/app/tui/widgets/editor/vim.py +1195 -0
- chrys/app/tui/widgets/editor/widget.py +401 -0
- chrys/app/tui/widgets/file_preview.py +58 -0
- chrys/app/tui/widgets/hatch.py +138 -0
- chrys/app/tui/widgets/input.py +66 -0
- chrys/app/tui/widgets/loading.py +125 -0
- chrys/app/tui/widgets/markdown/__init__.py +25 -0
- chrys/app/tui/widgets/markdown/_utils.py +21 -0
- chrys/app/tui/widgets/markdown/anchors.py +71 -0
- chrys/app/tui/widgets/markdown/blocks.py +115 -0
- chrys/app/tui/widgets/markdown/copyable.py +163 -0
- chrys/app/tui/widgets/markdown/diagram/__init__.py +35 -0
- chrys/app/tui/widgets/markdown/diagram/canvas.py +409 -0
- chrys/app/tui/widgets/markdown/diagram/charts.py +52 -0
- chrys/app/tui/widgets/markdown/diagram/diagnostics.py +101 -0
- chrys/app/tui/widgets/markdown/diagram/geometry.py +46 -0
- chrys/app/tui/widgets/markdown/diagram/layout.py +494 -0
- chrys/app/tui/widgets/markdown/diagram/messages.py +18 -0
- chrys/app/tui/widgets/markdown/diagram/model.py +275 -0
- chrys/app/tui/widgets/markdown/diagram/parser.py +173 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/__init__.py +3 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/charts.py +349 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/common.py +403 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/graphs.py +1072 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/planning.py +317 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/schedule.py +298 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/schemas.py +241 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/structure.py +221 -0
- chrys/app/tui/widgets/markdown/diagram/presentation.py +32 -0
- chrys/app/tui/widgets/markdown/diagram/renderers/__init__.py +3 -0
- chrys/app/tui/widgets/markdown/diagram/renderers/charts.py +275 -0
- chrys/app/tui/widgets/markdown/diagram/renderers/common.py +73 -0
- chrys/app/tui/widgets/markdown/diagram/renderers/planning.py +157 -0
- chrys/app/tui/widgets/markdown/diagram/renderers/schedule.py +202 -0
- chrys/app/tui/widgets/markdown/diagram/renderers/structure.py +77 -0
- chrys/app/tui/widgets/markdown/diagram/renderers/xy.py +385 -0
- chrys/app/tui/widgets/markdown/diagram/router.py +651 -0
- chrys/app/tui/widgets/markdown/diagram/specs/__init__.py +3 -0
- chrys/app/tui/widgets/markdown/diagram/specs/charts.py +94 -0
- chrys/app/tui/widgets/markdown/diagram/specs/planning.py +68 -0
- chrys/app/tui/widgets/markdown/diagram/specs/schedule.py +65 -0
- chrys/app/tui/widgets/markdown/diagram/specs/structure.py +23 -0
- chrys/app/tui/widgets/markdown/diagram/viewer.py +92 -0
- chrys/app/tui/widgets/markdown/links.py +47 -0
- chrys/app/tui/widgets/markdown/math/__init__.py +36 -0
- chrys/app/tui/widgets/markdown/math/layout.py +739 -0
- chrys/app/tui/widgets/markdown/math/markdown.py +291 -0
- chrys/app/tui/widgets/markdown/math/parser.py +325 -0
- chrys/app/tui/widgets/markdown/math/symbols.py +325 -0
- chrys/app/tui/widgets/markdown/navigator.py +80 -0
- chrys/app/tui/widgets/markdown/parser.py +1057 -0
- chrys/app/tui/widgets/markdown/stream.py +73 -0
- chrys/app/tui/widgets/markdown/toc.py +98 -0
- chrys/app/tui/widgets/markdown/viewer.py +146 -0
- chrys/app/tui/widgets/markdown/widget.py +2046 -0
- chrys/app/tui/widgets/marquee.py +101 -0
- chrys/app/tui/widgets/option_menu.py +82 -0
- chrys/app/tui/widgets/page_navigator.py +118 -0
- chrys/app/tui/widgets/select.py +196 -0
- chrys/app/tui/widgets/selection.py +59 -0
- chrys/app/tui/widgets/sidebar/__init__.py +3 -0
- chrys/app/tui/widgets/sidebar/buddy.py +367 -0
- chrys/app/tui/widgets/sidebar/context.py +482 -0
- chrys/app/tui/widgets/sidebar/debug.py +195 -0
- chrys/app/tui/widgets/sidebar/empty_state.py +11 -0
- chrys/app/tui/widgets/sidebar/panel.py +198 -0
- chrys/app/tui/widgets/sidebar/tasks.py +198 -0
- chrys/app/tui/widgets/sidebar/toc.py +166 -0
- chrys/app/tui/widgets/sidebar/toc_types.py +30 -0
- chrys/app/tui/widgets/syntax_theme.py +85 -0
- chrys/app/tui/widgets/text_area.py +258 -0
- chrys/app/tui/widgets/trajectory/__init__.py +8 -0
- chrys/app/tui/widgets/trajectory/chartkit.py +264 -0
- chrys/app/tui/widgets/trajectory/insights.py +1266 -0
- chrys/app/tui/widgets/trajectory/overview.py +1101 -0
- chrys/app/tui/widgets/trajectory/panel.py +983 -0
- chrys/app/tui/widgets/trajectory/presentation.py +311 -0
- chrys/app/tui/widgets/trajectory/session_info.py +124 -0
- chrys/app/tui/widgets/trajectory/text_view.py +124 -0
- chrys/app/tui/widgets/trajectory/timeline.py +380 -0
- chrys/app/tui/widgets/welcome.py +126 -0
- chrys/app/tui/widgets/workflow/__init__.py +5 -0
- chrys/app/tui/widgets/workflow/edges.py +89 -0
- chrys/app/tui/widgets/workflow/graph.py +869 -0
- chrys/app/tui/widgets/workflow/info.py +310 -0
- chrys/app/tui/widgets/workflow/node_view.py +27 -0
- chrys/app/tui/widgets/workflow/output.py +225 -0
- chrys/app/tui/widgets/workflow/panel.py +658 -0
- chrys/app/tui/widgets/workflow/projector.py +324 -0
- chrys/app/tui/widgets/workflow/records.py +69 -0
- chrys/app/tui/widgets/workflow/scrollbar.py +82 -0
- chrys/app/tui/widgets/workflow/selection.py +151 -0
- chrys/app/tui/widgets/workflow/source.py +65 -0
- chrys/app/tui/widgets/workflow/text.py +257 -0
- chrys/app/tui/widgets/workflow/values.py +317 -0
- chrys/foundation/__init__.py +0 -0
- chrys/foundation/branding.py +15 -0
- chrys/foundation/config/__init__.py +7 -0
- chrys/foundation/config/coercion.py +374 -0
- chrys/foundation/config/context.py +34 -0
- chrys/foundation/config/env_file.py +141 -0
- chrys/foundation/config/env_layers.py +370 -0
- chrys/foundation/config/migrations.py +521 -0
- chrys/foundation/config/notification_events.py +22 -0
- chrys/foundation/config/process_settings.py +332 -0
- chrys/foundation/config/runtime_pointer.py +133 -0
- chrys/foundation/config/settings.py +1952 -0
- chrys/foundation/config/settings_store.py +996 -0
- chrys/foundation/config/spec.py +396 -0
- chrys/foundation/config/user_settings.py +140 -0
- chrys/foundation/config/warnings.py +262 -0
- chrys/foundation/config/web_values.py +135 -0
- chrys/foundation/config/yaml_store.py +487 -0
- chrys/foundation/errors/__init__.py +68 -0
- chrys/foundation/errors/_legacy.py +117 -0
- chrys/foundation/errors/_text.py +13 -0
- chrys/foundation/errors/_walk.py +85 -0
- chrys/foundation/errors/classify.py +278 -0
- chrys/foundation/errors/display.py +274 -0
- chrys/foundation/errors/formatting.py +283 -0
- chrys/foundation/errors/kinds.py +67 -0
- chrys/foundation/errors/network.py +497 -0
- chrys/foundation/errors/provider.py +445 -0
- chrys/foundation/errors/route.py +85 -0
- chrys/foundation/events/__init__.py +8 -0
- chrys/foundation/events/bus.py +143 -0
- chrys/foundation/events/types.py +1629 -0
- chrys/foundation/events/workflow.py +38 -0
- chrys/foundation/hosted_tools.py +142 -0
- chrys/foundation/i18n/__init__.py +32 -0
- chrys/foundation/i18n/_catalogs/zh-Hans/LC_MESSAGES/chrys.mo +0 -0
- chrys/foundation/i18n/catalogs.py +42 -0
- chrys/foundation/i18n/formatting.py +202 -0
- chrys/foundation/i18n/locale.py +92 -0
- chrys/foundation/i18n/localizer.py +187 -0
- chrys/foundation/i18n/messages.py +268 -0
- chrys/foundation/io/__init__.py +3 -0
- chrys/foundation/io/result_content.py +237 -0
- chrys/foundation/models/__init__.py +3 -0
- chrys/foundation/models/approval_reuse.py +23 -0
- chrys/foundation/models/ask_user.py +468 -0
- chrys/foundation/models/execution.py +18 -0
- chrys/foundation/models/history_markers.py +115 -0
- chrys/foundation/models/invocations.py +63 -0
- chrys/foundation/models/mutation_scope.py +28 -0
- chrys/foundation/models/session_env.py +87 -0
- chrys/foundation/models/session_surface.py +29 -0
- chrys/foundation/models/todos.py +74 -0
- chrys/foundation/models/turns.py +125 -0
- chrys/foundation/models/workflow_session.py +89 -0
- chrys/foundation/models/workspace.py +59 -0
- chrys/foundation/net/__init__.py +3 -0
- chrys/foundation/net/address_class.py +57 -0
- chrys/foundation/net/route_probe.py +94 -0
- chrys/foundation/net/url.py +107 -0
- chrys/foundation/observability/__init__.py +3 -0
- chrys/foundation/observability/exporters.py +174 -0
- chrys/foundation/observability/gate.py +31 -0
- chrys/foundation/observability/setup.py +497 -0
- chrys/foundation/observability/sink.py +228 -0
- chrys/foundation/patches/__init__.py +19 -0
- chrys/foundation/patches/mdurl_cache.py +59 -0
- chrys/foundation/patches/patcher.py +287 -0
- chrys/foundation/patches/staged_members.py +205 -0
- chrys/foundation/patches/textual_block_border.py +105 -0
- chrys/foundation/patches/textual_button_ansi.py +65 -0
- chrys/foundation/patches/textual_button_ansi_old.txt +68 -0
- chrys/foundation/patches/textual_callback_cache.py +248 -0
- chrys/foundation/patches/textual_callback_dispatch.py +109 -0
- chrys/foundation/patches/textual_compositor_cjk.py +566 -0
- chrys/foundation/patches/textual_dispatch_cache.py +150 -0
- chrys/foundation/patches/textual_ime_cursor_anchor.py +92 -0
- chrys/foundation/patches/textual_kitty_keyboard.py +268 -0
- chrys/foundation/patches/textual_lru_acyclic.py +241 -0
- chrys/foundation/patches/textual_message_pump.py +136 -0
- chrys/foundation/patches/textual_node_diet.py +875 -0
- chrys/foundation/patches/textual_one_shot_timer.py +48 -0
- chrys/foundation/patches/textual_option_list.py +90 -0
- chrys/foundation/patches/textual_precompose.py +89 -0
- chrys/foundation/patches/textual_pruned_tabs.py +69 -0
- chrys/foundation/patches/textual_reflow_reuse.py +1753 -0
- chrys/foundation/patches/textual_removed_node_caches.py +86 -0
- chrys/foundation/patches/textual_removed_screen_callbacks.py +55 -0
- chrys/foundation/patches/textual_selection_extract.py +48 -0
- chrys/foundation/patches/textual_strip_cycles.py +119 -0
- chrys/foundation/patches/textual_tab_selection.py +1611 -0
- chrys/foundation/patches/textual_timer_skip.py +70 -0
- chrys/foundation/patches/textual_utf8_decoder.py +106 -0
- chrys/foundation/patches/textual_win_sleep.py +167 -0
- chrys/foundation/patches/watchdog_fsevents.py +70 -0
- chrys/foundation/patches/watchdog_windows.py +52 -0
- chrys/foundation/platform/__init__.py +556 -0
- chrys/foundation/platform/c_api.py +32 -0
- chrys/foundation/platform/child_reap.py +107 -0
- chrys/foundation/platform/command_line.py +95 -0
- chrys/foundation/platform/files.py +1470 -0
- chrys/foundation/platform/output_capture.py +113 -0
- chrys/foundation/platform/paths.py +193 -0
- chrys/foundation/platform/process.py +1468 -0
- chrys/foundation/platform/pty_output.py +19 -0
- chrys/foundation/platform/runtime_paths.py +281 -0
- chrys/foundation/platform/win_console.py +129 -0
- chrys/foundation/reasoning_origin.py +67 -0
- chrys/foundation/recovery.py +16 -0
- chrys/foundation/retry.py +278 -0
- chrys/foundation/text/__init__.py +3 -0
- chrys/foundation/text/encoding.py +603 -0
- chrys/foundation/text/images.py +304 -0
- chrys/foundation/text/lines.py +24 -0
- chrys/foundation/text/mentions.py +90 -0
- chrys/foundation/text/model_json.py +25 -0
- chrys/foundation/text/reading_order.py +20 -0
- chrys/foundation/text/tokenizer.py +25 -0
- chrys/foundation/text/tool_output.py +287 -0
- chrys/foundation/text/yaml_io.py +62 -0
- chrys/foundation/tool_call_context.py +202 -0
- chrys/foundation/tool_execution_stamp.py +184 -0
- chrys/foundation/tool_invocation_order.py +48 -0
- chrys/foundation/tool_kinds.py +102 -0
- chrys/foundation/tool_result_metadata.py +287 -0
- chrys/foundation/trajectory/__init__.py +10 -0
- chrys/foundation/trajectory/context.py +481 -0
- chrys/foundation/trajectory/envelope.py +571 -0
- chrys/foundation/trajectory/event_types.py +294 -0
- chrys/foundation/trajectory/finalizers.py +46 -0
- chrys/foundation/trajectory/fingerprint.py +62 -0
- chrys/foundation/trajectory/ids.py +155 -0
- chrys/foundation/trajectory/keys.py +99 -0
- chrys/foundation/trajectory/lease.py +173 -0
- chrys/foundation/trajectory/metadata.py +72 -0
- chrys/foundation/trajectory/reader.py +271 -0
- chrys/foundation/trajectory/recovery.py +225 -0
- chrys/foundation/trajectory/revisions.py +152 -0
- chrys/foundation/trajectory/segments.py +225 -0
- chrys/foundation/trajectory/tools.py +117 -0
- chrys/foundation/trajectory/usage.py +151 -0
- chrys/foundation/trajectory/writer.py +972 -0
- chrys/foundation/trajectory_timing.py +97 -0
- chrys/foundation/util/__init__.py +3 -0
- chrys/foundation/util/async_tasks.py +29 -0
- chrys/foundation/util/chrys_headers.py +23 -0
- chrys/foundation/util/env_templates.py +104 -0
- chrys/foundation/util/filenames.py +96 -0
- chrys/foundation/util/header_charset.py +138 -0
- chrys/foundation/util/httpx_helpers.py +12 -0
- chrys/foundation/util/lock.py +236 -0
- chrys/foundation/util/once_close.py +46 -0
- chrys/foundation/util/session_ids.py +29 -0
- chrys/foundation/util/shell_tokens.py +88 -0
- chrys/foundation/util/sub_agent_context.py +38 -0
- chrys/foundation/util/time.py +35 -0
- chrys/foundation/util/unicode_scalars.py +36 -0
- chrys/foundation/vendor/__init__.py +43 -0
- chrys/foundation/vendor/ripgrep/rg-aarch64-apple-darwin +0 -0
- chrys/foundation/vendor/ripgrep/rg-aarch64-pc-windows-msvc.exe +0 -0
- chrys/foundation/vendor/ripgrep/rg-aarch64-unknown-linux-gnu +0 -0
- chrys/foundation/vendor/ripgrep/rg-x86_64-apple-darwin +0 -0
- chrys/foundation/vendor/ripgrep/rg-x86_64-pc-windows-msvc.exe +0 -0
- chrys/foundation/vendor/ripgrep/rg-x86_64-unknown-linux-musl +0 -0
- chrys/kernel/__init__.py +256 -0
- chrys/kernel/_content.py +1866 -0
- chrys/kernel/_loop_recorder.py +631 -0
- chrys/kernel/_null_overlay.py +1026 -0
- chrys/kernel/_result_ceiling.py +216 -0
- chrys/kernel/_serialization.py +431 -0
- chrys/kernel/_tool_arg_errors.py +1629 -0
- chrys/kernel/_tool_execution.py +1172 -0
- chrys/kernel/_tool_expansion.py +26 -0
- chrys/kernel/_types.py +2598 -0
- chrys/kernel/agent.py +994 -0
- chrys/kernel/client.py +1084 -0
- chrys/kernel/compaction.py +1315 -0
- chrys/kernel/exceptions.py +211 -0
- chrys/kernel/exchanges.py +683 -0
- chrys/kernel/identity.py +95 -0
- chrys/kernel/images.py +36 -0
- chrys/kernel/instrumentation.py +1618 -0
- chrys/kernel/loop.py +2308 -0
- chrys/kernel/middleware.py +616 -0
- chrys/kernel/sessions.py +604 -0
- chrys/kernel/tools.py +1061 -0
- chrys/kernel/types.py +126 -0
- chrys/orchestration/__init__.py +3 -0
- chrys/orchestration/engine/__init__.py +3 -0
- chrys/orchestration/engine/assembly.py +236 -0
- chrys/orchestration/engine/build/__init__.py +3 -0
- chrys/orchestration/engine/build/builder.py +1061 -0
- chrys/orchestration/engine/build/construction.py +408 -0
- chrys/orchestration/engine/build/loaded.py +139 -0
- chrys/orchestration/engine/engine.py +789 -0
- chrys/orchestration/engine/execution.py +771 -0
- chrys/orchestration/engine/loader.py +865 -0
- chrys/orchestration/engine/rollback.py +918 -0
- chrys/orchestration/engine/run/__init__.py +3 -0
- chrys/orchestration/engine/run/active_injection.py +419 -0
- chrys/orchestration/engine/run/attachments.py +519 -0
- chrys/orchestration/engine/run/bindings.py +1095 -0
- chrys/orchestration/engine/run/coordinator.py +1062 -0
- chrys/orchestration/engine/run/finalizer.py +417 -0
- chrys/orchestration/engine/run/input_refs.py +60 -0
- chrys/orchestration/engine/run/prompt_content.py +457 -0
- chrys/orchestration/engine/run/resume.py +299 -0
- chrys/orchestration/engine/run/retry.py +948 -0
- chrys/orchestration/engine/run/runner.py +625 -0
- chrys/orchestration/engine/run/runtime_skills.py +146 -0
- chrys/orchestration/engine/run/sub_agent_coordination.py +126 -0
- chrys/orchestration/engine/run/turn_hooks.py +258 -0
- chrys/orchestration/engine/run/turn_state.py +149 -0
- chrys/orchestration/engine/run/working_dir.py +50 -0
- chrys/orchestration/engine/session_lifecycle.py +2013 -0
- chrys/orchestration/engine/state/__init__.py +3 -0
- chrys/orchestration/engine/state/active_session.py +183 -0
- chrys/orchestration/engine/state/controls.py +639 -0
- chrys/orchestration/engine/state/current_agent.py +26 -0
- chrys/orchestration/engine/state/lifecycle_permits.py +395 -0
- chrys/orchestration/engine/state/machine.py +193 -0
- chrys/orchestration/engine/state/session_writer.py +434 -0
- chrys/orchestration/engine/trajectory.py +714 -0
- chrys/orchestration/engine/usage.py +118 -0
- chrys/orchestration/invoker/__init__.py +3 -0
- chrys/orchestration/invoker/acp.py +727 -0
- chrys/orchestration/invoker/acp_protocol.py +1115 -0
- chrys/orchestration/invoker/acp_spec.py +79 -0
- chrys/orchestration/invoker/attempts.py +994 -0
- chrys/orchestration/invoker/child_compaction.py +131 -0
- chrys/orchestration/invoker/child_history.py +99 -0
- chrys/orchestration/invoker/contracts.py +253 -0
- chrys/orchestration/invoker/evidence.py +94 -0
- chrys/orchestration/invoker/kernel.py +343 -0
- chrys/orchestration/invoker/origin.py +79 -0
- chrys/orchestration/invoker/resources.py +343 -0
- chrys/orchestration/invoker/runtime.py +299 -0
- chrys/orchestration/invoker/usage.py +80 -0
- chrys/orchestration/session_hooks.py +117 -0
- chrys/orchestration/session_host.py +1023 -0
- chrys/orchestration/session_resources.py +95 -0
- chrys/orchestration/session_usage.py +219 -0
- chrys/orchestration/startup.py +255 -0
- chrys/orchestration/sub_agents/__init__.py +3 -0
- chrys/orchestration/sub_agents/acp_policy.py +269 -0
- chrys/orchestration/sub_agents/kernel_policy.py +848 -0
- chrys/orchestration/sub_agents/registration.py +44 -0
- chrys/orchestration/sub_agents/shell.py +337 -0
- chrys/orchestration/sub_agents/tools.py +2228 -0
- chrys/orchestration/workflows/__init__.py +3 -0
- chrys/orchestration/workflows/agent_archive.py +156 -0
- chrys/orchestration/workflows/agent_node.py +894 -0
- chrys/orchestration/workflows/agent_node_build.py +687 -0
- chrys/orchestration/workflows/catalog.py +332 -0
- chrys/orchestration/workflows/coordinator.py +771 -0
- chrys/orchestration/workflows/hooks.py +176 -0
- chrys/orchestration/workflows/preview.py +322 -0
- chrys/orchestration/workflows/rollback.py +151 -0
- chrys/orchestration/workflows/runner.py +986 -0
- chrys/orchestration/workflows/session.py +390 -0
- chrys/orchestration/workflows/settings.py +97 -0
- chrys/orchestration/workflows/validation.py +674 -0
- chrys/orchestration/workflows/worker_client.py +1002 -0
- chrys/service/__init__.py +3 -0
- chrys/service/acp_client/__init__.py +65 -0
- chrys/service/acp_client/_transport.py +922 -0
- chrys/service/acp_client/client.py +1311 -0
- chrys/service/acp_client/errors.py +224 -0
- chrys/service/acp_client/protocol.py +220 -0
- chrys/service/acp_client/spawn.py +239 -0
- chrys/service/acp_client/spec.py +100 -0
- chrys/service/agent_middleware/__init__.py +60 -0
- chrys/service/agent_middleware/_metadata_keys.py +52 -0
- chrys/service/agent_middleware/control/__init__.py +3 -0
- chrys/service/agent_middleware/control/approval.py +769 -0
- chrys/service/agent_middleware/control/approval_hooks.py +62 -0
- chrys/service/agent_middleware/control/ask_user.py +207 -0
- chrys/service/agent_middleware/control/interrupt.py +50 -0
- chrys/service/agent_middleware/control/sleep.py +118 -0
- chrys/service/agent_middleware/control/todo.py +117 -0
- chrys/service/agent_middleware/events/__init__.py +3 -0
- chrys/service/agent_middleware/events/hook_dispatch.py +250 -0
- chrys/service/agent_middleware/events/hosted_tools.py +1762 -0
- chrys/service/agent_middleware/events/intermediate_text.py +128 -0
- chrys/service/agent_middleware/events/rejection_metadata.py +50 -0
- chrys/service/agent_middleware/events/result_persistence.py +98 -0
- chrys/service/agent_middleware/events/sub_agent_events.py +951 -0
- chrys/service/agent_middleware/events/tool_error_text.py +22 -0
- chrys/service/agent_middleware/events/tool_events.py +779 -0
- chrys/service/agent_middleware/injection.py +510 -0
- chrys/service/agent_middleware/reminders/__init__.py +91 -0
- chrys/service/agent_middleware/reminders/archive_pointer.py +154 -0
- chrys/service/agent_middleware/reminders/base.py +25 -0
- chrys/service/agent_middleware/reminders/context_usage.py +74 -0
- chrys/service/agent_middleware/reminders/file_change.py +63 -0
- chrys/service/agent_middleware/reminders/mcp.py +39 -0
- chrys/service/agent_middleware/reminders/profile_switch.py +106 -0
- chrys/service/agent_middleware/reminders/runtime_env.py +190 -0
- chrys/service/agent_middleware/reminders/skills.py +44 -0
- chrys/service/agent_middleware/reminders/sub_agents.py +35 -0
- chrys/service/agent_middleware/reminders/todo.py +35 -0
- chrys/service/agent_middleware/reminders/turn_line.py +48 -0
- chrys/service/agent_middleware/response_validation.py +1380 -0
- chrys/service/agent_middleware/system_reminder.py +1107 -0
- chrys/service/agent_middleware/validators.py +396 -0
- chrys/service/analytics/__init__.py +124 -0
- chrys/service/analytics/_actions.py +896 -0
- chrys/service/analytics/_context_evidence.py +357 -0
- chrys/service/analytics/_critical_path.py +179 -0
- chrys/service/analytics/_facts.py +919 -0
- chrys/service/analytics/_insights.py +769 -0
- chrys/service/analytics/_metric_ops.py +83 -0
- chrys/service/analytics/_session_projection.py +460 -0
- chrys/service/analytics/_timeline.py +434 -0
- chrys/service/analytics/_turn_graph.py +1237 -0
- chrys/service/analytics/_turns.py +1377 -0
- chrys/service/analytics/_workflows.py +171 -0
- chrys/service/analytics/aggregation.py +1474 -0
- chrys/service/analytics/classification.py +128 -0
- chrys/service/analytics/export.py +803 -0
- chrys/service/analytics/findings.py +282 -0
- chrys/service/analytics/math.py +79 -0
- chrys/service/analytics/model.py +886 -0
- chrys/service/analytics/reader.py +321 -0
- chrys/service/approval/__init__.py +3 -0
- chrys/service/approval/arbitration.py +102 -0
- chrys/service/approval/command_identity.py +109 -0
- chrys/service/approval/correlation.py +57 -0
- chrys/service/approval/grant_store.py +108 -0
- chrys/service/approval/judge.py +589 -0
- chrys/service/approval/level.py +15 -0
- chrys/service/approval/policy.py +209 -0
- chrys/service/approval/reuse.py +223 -0
- chrys/service/approval/reuse_binding.py +133 -0
- chrys/service/approval/safety_classifier.py +536 -0
- chrys/service/approval/turn_context.py +49 -0
- chrys/service/context/__init__.py +3 -0
- chrys/service/context/compaction/__init__.py +38 -0
- chrys/service/context/compaction/breaker.py +156 -0
- chrys/service/context/compaction/budgets.py +93 -0
- chrys/service/context/compaction/calibration.py +77 -0
- chrys/service/context/compaction/compression.py +690 -0
- chrys/service/context/compaction/current_turn_drop.py +458 -0
- chrys/service/context/compaction/events.py +201 -0
- chrys/service/context/compaction/exclusions.py +261 -0
- chrys/service/context/compaction/groups.py +361 -0
- chrys/service/context/compaction/last_words.py +1996 -0
- chrys/service/context/compaction/last_words_state.py +752 -0
- chrys/service/context/compaction/scoped.py +472 -0
- chrys/service/context/compaction/spill.py +1947 -0
- chrys/service/context/compaction/strategy.py +1116 -0
- chrys/service/context/compaction/summaries.py +319 -0
- chrys/service/context/compaction/turns.py +375 -0
- chrys/service/context/manager.py +174 -0
- chrys/service/context/memory_loader.py +792 -0
- chrys/service/context/middleware/__init__.py +3 -0
- chrys/service/context/middleware/usage.py +332 -0
- chrys/service/context/providers/__init__.py +3 -0
- chrys/service/context/providers/context_management.py +432 -0
- chrys/service/context/providers/history.py +647 -0
- chrys/service/context/providers/memory.py +50 -0
- chrys/service/context/tool_content.py +22 -0
- chrys/service/hooks/__init__.py +37 -0
- chrys/service/hooks/detached_worker.py +118 -0
- chrys/service/hooks/docs/README.md +14 -0
- chrys/service/hooks/docs/authoring.md +684 -0
- chrys/service/hooks/docs/configuration.md +499 -0
- chrys/service/hooks/docs/design.md +359 -0
- chrys/service/hooks/docs/project-hooks.md +348 -0
- chrys/service/hooks/events.py +157 -0
- chrys/service/hooks/loader.py +665 -0
- chrys/service/hooks/manager.py +807 -0
- chrys/service/hooks/matcher.py +111 -0
- chrys/service/hooks/outbox.py +294 -0
- chrys/service/hooks/runner.py +572 -0
- chrys/service/hooks/schema.py +407 -0
- chrys/service/llm/__init__.py +7 -0
- chrys/service/llm/_structured_outputs.py +192 -0
- chrys/service/llm/anthropic_messages/__init__.py +9 -0
- chrys/service/llm/anthropic_messages/client.py +254 -0
- chrys/service/llm/anthropic_messages/decode.py +331 -0
- chrys/service/llm/anthropic_messages/history.py +279 -0
- chrys/service/llm/anthropic_messages/request.py +323 -0
- chrys/service/llm/anthropic_messages/server_tools.py +319 -0
- chrys/service/llm/anthropic_messages/stream.py +297 -0
- chrys/service/llm/anthropic_messages/thinking_binding.py +156 -0
- chrys/service/llm/chat_completions/__init__.py +9 -0
- chrys/service/llm/chat_completions/client.py +369 -0
- chrys/service/llm/chat_completions/decode.py +338 -0
- chrys/service/llm/chat_completions/history.py +657 -0
- chrys/service/llm/chat_completions/reasoning.py +244 -0
- chrys/service/llm/chat_completions/request.py +192 -0
- chrys/service/llm/chat_completions/stream.py +546 -0
- chrys/service/llm/chat_completions/validation.py +308 -0
- chrys/service/llm/clients.py +613 -0
- chrys/service/llm/images.py +65 -0
- chrys/service/llm/mock.py +413 -0
- chrys/service/llm/observer.py +446 -0
- chrys/service/llm/one_shot.py +106 -0
- chrys/service/llm/openai_exceptions.py +93 -0
- chrys/service/llm/openai_responses/__init__.py +10 -0
- chrys/service/llm/openai_responses/client.py +323 -0
- chrys/service/llm/openai_responses/decode.py +432 -0
- chrys/service/llm/openai_responses/history.py +519 -0
- chrys/service/llm/openai_responses/hosted.py +625 -0
- chrys/service/llm/openai_responses/replay.py +629 -0
- chrys/service/llm/openai_responses/request.py +342 -0
- chrys/service/llm/openai_responses/stream.py +847 -0
- chrys/service/llm/openai_timestamps.py +57 -0
- chrys/service/llm/providers.py +107 -0
- chrys/service/llm/proxy_route.py +54 -0
- chrys/service/llm/raw_http_log.py +309 -0
- chrys/service/llm/route_facts.py +63 -0
- chrys/service/llm/route_sessions.py +49 -0
- chrys/service/llm/sdk_anthropic.py +18 -0
- chrys/service/llm/sdk_headers.py +47 -0
- chrys/service/llm/sdk_openai.py +18 -0
- chrys/service/llm/sdk_retry.py +59 -0
- chrys/service/llm/wire_client.py +246 -0
- chrys/service/mcp/__init__.py +3 -0
- chrys/service/mcp/_connection.py +235 -0
- chrys/service/mcp/_http_transport.py +350 -0
- chrys/service/mcp/_progressive.py +459 -0
- chrys/service/mcp/_stdio_transport.py +614 -0
- chrys/service/mcp/_tool_mixins.py +96 -0
- chrys/service/mcp/adapter.py +1031 -0
- chrys/service/mcp/cache.py +476 -0
- chrys/service/mcp/content.py +32 -0
- chrys/service/mcp/errors.py +169 -0
- chrys/service/mcp/owned.py +1330 -0
- chrys/service/mcp/result_limits.py +168 -0
- chrys/service/mcp/thinking_warning.py +95 -0
- chrys/service/mcp/validation.py +74 -0
- chrys/service/mutations/__init__.py +84 -0
- chrys/service/mutations/coordination.py +894 -0
- chrys/service/mutations/detector.py +458 -0
- chrys/service/mutations/git_calibrator.py +397 -0
- chrys/service/mutations/git_state.py +647 -0
- chrys/service/mutations/pipeline.py +779 -0
- chrys/service/mutations/scanner.py +466 -0
- chrys/service/mutations/snapshot_files.py +233 -0
- chrys/service/mutations/store.py +625 -0
- chrys/service/mutations/tool_names.py +15 -0
- chrys/service/mutations/trace.py +246 -0
- chrys/service/mutations/tracker.py +1289 -0
- chrys/service/mutations/types.py +559 -0
- chrys/service/mutations/workspace_changes.py +1583 -0
- chrys/service/profiles/__init__.py +2 -0
- chrys/service/profiles/agents/__init__.py +3 -0
- chrys/service/profiles/agents/builtins/Code.yaml +199 -0
- chrys/service/profiles/agents/builtins/Explore.yaml +62 -0
- chrys/service/profiles/agents/builtins/General.yaml +114 -0
- chrys/service/profiles/agents/builtins/QA.yaml +128 -0
- chrys/service/profiles/agents/loader.py +808 -0
- chrys/service/profiles/agents/registry.py +727 -0
- chrys/service/profiles/agents/schema.py +371 -0
- chrys/service/profiles/agents/serializer.py +196 -0
- chrys/service/profiles/coercion.py +22 -0
- chrys/service/profiles/models/__init__.py +3 -0
- chrys/service/profiles/models/env_bridge.py +157 -0
- chrys/service/profiles/models/loader.py +282 -0
- chrys/service/profiles/models/options.py +438 -0
- chrys/service/profiles/models/registry.py +104 -0
- chrys/service/profiles/models/resolver.py +286 -0
- chrys/service/profiles/models/schema.py +91 -0
- chrys/service/profiles/models/serializer.py +76 -0
- chrys/service/session/__init__.py +3 -0
- chrys/service/session/checkpoint.py +156 -0
- chrys/service/session/history.py +1616 -0
- chrys/service/session/message_metadata.py +151 -0
- chrys/service/session/persistence.py +435 -0
- chrys/service/session/runtime_metadata.py +210 -0
- chrys/service/session/sub_agent_logs.py +1069 -0
- chrys/service/session/sub_agent_transcript.py +654 -0
- chrys/service/skills/__init__.py +3 -0
- chrys/service/skills/adapter.py +408 -0
- chrys/service/skills/constants.py +8 -0
- chrys/service/skills/loader.py +575 -0
- chrys/service/skills/model.py +130 -0
- chrys/service/skills/provider.py +841 -0
- chrys/service/skills/runner.py +390 -0
- chrys/service/state/__init__.py +3 -0
- chrys/service/state/_fork.py +710 -0
- chrys/service/state/_session_files.py +175 -0
- chrys/service/state/_session_meta.py +552 -0
- chrys/service/state/locks.py +154 -0
- chrys/service/state/serializers.py +156 -0
- chrys/service/state/session_catalog.py +361 -0
- chrys/service/state/session_listing.py +84 -0
- chrys/service/state/session_migration.py +446 -0
- chrys/service/state/session_mru.py +315 -0
- chrys/service/state/store.py +2132 -0
- chrys/service/state/workflow.py +158 -0
- chrys/service/text_blocks.py +47 -0
- chrys/service/todos/__init__.py +3 -0
- chrys/service/todos/reminder.py +31 -0
- chrys/service/todos/tracker.py +58 -0
- chrys/service/tools/__init__.py +3 -0
- chrys/service/tools/approval_targets.py +92 -0
- chrys/service/tools/builtins/__init__.py +3 -0
- chrys/service/tools/builtins/ask_user.py +326 -0
- chrys/service/tools/builtins/doc_converter/__init__.py +494 -0
- chrys/service/tools/builtins/doc_converter/artifacts.py +392 -0
- chrys/service/tools/builtins/doc_converter/parsers/__init__.py +3 -0
- chrys/service/tools/builtins/doc_converter/parsers/_table.py +34 -0
- chrys/service/tools/builtins/doc_converter/parsers/base.py +101 -0
- chrys/service/tools/builtins/doc_converter/parsers/docx.py +88 -0
- chrys/service/tools/builtins/doc_converter/parsers/pdf.py +144 -0
- chrys/service/tools/builtins/doc_converter/parsers/pptx.py +103 -0
- chrys/service/tools/builtins/doc_converter/parsers/xls.py +32 -0
- chrys/service/tools/builtins/doc_converter/parsers/xlsx.py +51 -0
- chrys/service/tools/builtins/doc_converter/registry.py +55 -0
- chrys/service/tools/builtins/filesystem.py +1071 -0
- chrys/service/tools/builtins/search.py +1265 -0
- chrys/service/tools/builtins/shell.py +967 -0
- chrys/service/tools/builtins/shell_command_filtering/__init__.py +5 -0
- chrys/service/tools/builtins/shell_command_filtering/policy.py +60 -0
- chrys/service/tools/builtins/shell_command_filtering/presets.py +152 -0
- chrys/service/tools/builtins/shell_command_filtering/readonly/__init__.py +358 -0
- chrys/service/tools/builtins/shell_command_filtering/readonly/commands.py +416 -0
- chrys/service/tools/builtins/shell_command_filtering/readonly/git.py +408 -0
- chrys/service/tools/builtins/shell_command_filtering/readonly/syntax.py +87 -0
- chrys/service/tools/builtins/shell_command_filtering/tokenizer.py +214 -0
- chrys/service/tools/builtins/shell_filter.py +24 -0
- chrys/service/tools/builtins/sleep.py +91 -0
- chrys/service/tools/builtins/todo.py +64 -0
- chrys/service/tools/builtins/web/__init__.py +6 -0
- chrys/service/tools/builtins/web/build.py +268 -0
- chrys/service/tools/builtins/web/config.py +338 -0
- chrys/service/tools/builtins/web/credentials.py +37 -0
- chrys/service/tools/builtins/web/fetch/__init__.py +3 -0
- chrys/service/tools/builtins/web/fetch/cache.py +68 -0
- chrys/service/tools/builtins/web/fetch/convert.py +56 -0
- chrys/service/tools/builtins/web/fetch/tool.py +223 -0
- chrys/service/tools/builtins/web/hosted.py +61 -0
- chrys/service/tools/builtins/web/http.py +330 -0
- chrys/service/tools/builtins/web/progress.py +18 -0
- chrys/service/tools/builtins/web/search/__init__.py +3 -0
- chrys/service/tools/builtins/web/search/exa_mcp.py +146 -0
- chrys/service/tools/builtins/web/search/html.py +152 -0
- chrys/service/tools/builtins/web/search/json_api.py +227 -0
- chrys/service/tools/builtins/web/search/providers.py +77 -0
- chrys/service/tools/builtins/web/search/tool.py +218 -0
- chrys/service/tools/builtins/web/search/types.py +28 -0
- chrys/service/tools/builtins/web/tls_identity.py +66 -0
- chrys/service/tools/kinds.py +115 -0
- chrys/service/tools/names.py +47 -0
- chrys/service/tools/registry.py +242 -0
- chrys/service/tools/result_metadata.py +103 -0
- chrys/service/tools/session_artifacts.py +196 -0
- chrys/service/tools/spill.py +218 -0
- chrys/service/tools/workspace_paths.py +81 -0
- chrys/service/trajectory/__init__.py +11 -0
- chrys/service/trajectory/approvals.py +201 -0
- chrys/service/trajectory/compaction.py +420 -0
- chrys/service/trajectory/fork.py +75 -0
- chrys/service/trajectory/hooks.py +217 -0
- chrys/service/trajectory/items.py +41 -0
- chrys/service/trajectory/preparation.py +374 -0
- chrys/service/trajectory/retries.py +95 -0
- chrys/service/trajectory/revisions.py +129 -0
- chrys/service/trajectory/segmented.py +163 -0
- chrys/service/trajectory/session.py +762 -0
- chrys/service/trajectory/state.py +83 -0
- chrys/service/trajectory/sub_agents.py +169 -0
- chrys/service/trajectory/tombstone.py +262 -0
- chrys/service/trajectory/tools.py +323 -0
- chrys/service/trajectory/validation.py +130 -0
- chrys/service/trajectory/waits.py +161 -0
- chrys/service/trajectory/workflow.py +148 -0
- chrys/service/vision.py +128 -0
- chrys/service/workflows/__init__.py +3 -0
- chrys/service/workflows/admission.py +151 -0
- chrys/service/workflows/artifacts.py +109 -0
- chrys/service/workflows/asks.py +130 -0
- chrys/service/workflows/builtins/__init__.py +12 -0
- chrys/service/workflows/builtins/demo-workflow.manifest.json +635 -0
- chrys/service/workflows/builtins/demo-workflow.py +756 -0
- chrys/service/workflows/discovery.py +554 -0
- chrys/service/workflows/environment.py +284 -0
- chrys/service/workflows/graph.py +430 -0
- chrys/service/workflows/history.py +82 -0
- chrys/service/workflows/interpreter.py +107 -0
- chrys/service/workflows/journal.py +334 -0
- chrys/service/workflows/layout.py +56 -0
- chrys/service/workflows/ledger.py +149 -0
- chrys/service/workflows/model_selection.py +18 -0
- chrys/service/workflows/orphans.py +209 -0
- chrys/service/workflows/outcomes.py +46 -0
- chrys/service/workflows/protocol.py +210 -0
- chrys/service/workflows/records.py +142 -0
- chrys/service/workflows/scheduler.py +770 -0
- chrys/service/workflows/sdk/__init__.py +51 -0
- chrys/service/workflows/sdk/_ask.py +167 -0
- chrys/service/workflows/sdk/_builder.py +781 -0
- chrys/service/workflows/sdk/_values.py +92 -0
- chrys/service/workflows/sdk_artifact.py +74 -0
- chrys/service/workflows/store.py +494 -0
- chrys/service/workflows/transcript.py +102 -0
- chrys/service/workflows/values.py +73 -0
- chrys/service/workflows/worker_host.py +1820 -0
- chrys/workflows.py +38 -0
- icode_tui-0.29.1.dist-info/METADATA +104 -0
- icode_tui-0.29.1.dist-info/RECORD +1138 -0
- icode_tui-0.29.1.dist-info/WHEEL +4 -0
- icode_tui-0.29.1.dist-info/entry_points.txt +2 -0
- icode_tui-0.29.1.dist-info/licenses/LICENSE +202 -0
- icode_tui-0.29.1.dist-info/licenses/NOTICE +1955 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Install file-patched class members on classes that are already imported.
|
|
4
|
+
|
|
5
|
+
A ``FilePatch`` rewrites the installed module for the next process, but classes imported before
|
|
6
|
+
``apply_all()`` keep the members they were built with. Instead of duplicating each patched body,
|
|
7
|
+
a runtime patch stages the same fragments on the installed source in memory, compiles only the
|
|
8
|
+
members it names and sets them on the live classes, so imported aliases, subclasses and existing
|
|
9
|
+
instances all see them, and the file and runtime paths share one source of truth.
|
|
10
|
+
|
|
11
|
+
Members are compiled inside a same-named stand-in class, so decorators (``property`` and its
|
|
12
|
+
setter) and class-level assignments stage as they do in the real class body. Their globals are
|
|
13
|
+
the live module's, and a zero-argument ``super()`` is rebound to the live class. A class the
|
|
14
|
+
patch adds to a module is compiled whole and set on the module.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
import __future__
|
|
19
|
+
|
|
20
|
+
import ast
|
|
21
|
+
import logging
|
|
22
|
+
from collections.abc import Mapping, Sequence
|
|
23
|
+
from dataclasses import dataclass
|
|
24
|
+
from functools import cached_property
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
from types import FunctionType, ModuleType
|
|
27
|
+
|
|
28
|
+
from chrys.foundation.patches.patcher import FilePatch
|
|
29
|
+
|
|
30
|
+
logger = logging.getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class StagedSourceDriftError(Exception):
|
|
34
|
+
"""The installed source no longer matches a fragment or a member the patch stages."""
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass(frozen=True, slots=True)
|
|
38
|
+
class StagedMembers:
|
|
39
|
+
"""Compiled members ready to be set on their live classes."""
|
|
40
|
+
|
|
41
|
+
replacements: tuple[tuple[type | ModuleType, str, object], ...]
|
|
42
|
+
|
|
43
|
+
def install(self, marker: str) -> None:
|
|
44
|
+
"""Set every member on its live class, marking each compiled function with ``marker``.
|
|
45
|
+
|
|
46
|
+
Members are set one by one, with nothing to roll back: drift is found while staging, so
|
|
47
|
+
a caller that stages every module before installing any installs nothing on drift.
|
|
48
|
+
|
|
49
|
+
A plain value (a class-level default or counter, or a class added to a module) is only
|
|
50
|
+
added, never overwritten, so live state survives when the class or module already has it
|
|
51
|
+
(an already file-patched install). A patch therefore cannot change a plain value the
|
|
52
|
+
upstream class already defines: the file patch would write it, while the runtime install
|
|
53
|
+
keeps the upstream value. Such a patch adds a new name instead.
|
|
54
|
+
"""
|
|
55
|
+
for target, name, value in self.replacements:
|
|
56
|
+
functions = _functions_of(value)
|
|
57
|
+
if not functions and name in vars(target):
|
|
58
|
+
continue
|
|
59
|
+
for function in functions:
|
|
60
|
+
setattr(function, marker, True)
|
|
61
|
+
setattr(target, name, value)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def install_patched_members(
|
|
65
|
+
module: ModuleType,
|
|
66
|
+
patches: Sequence[FilePatch],
|
|
67
|
+
members: Mapping[str, Sequence[str]],
|
|
68
|
+
*,
|
|
69
|
+
marker: str,
|
|
70
|
+
label: str,
|
|
71
|
+
) -> bool:
|
|
72
|
+
"""Install ``members`` (class name → member names) of ``module`` from its patched source.
|
|
73
|
+
|
|
74
|
+
Every compiled function carries ``marker``, so repeated calls are no-ops. Returns whether the
|
|
75
|
+
members are installed. Drift is found while staging, before any member is set, so on drift
|
|
76
|
+
nothing is changed and a warning is logged.
|
|
77
|
+
"""
|
|
78
|
+
if members_installed(module, members, marker):
|
|
79
|
+
return True
|
|
80
|
+
try:
|
|
81
|
+
staged = stage_members(module, patches, members, label=label)
|
|
82
|
+
except StagedSourceDriftError as exc:
|
|
83
|
+
logger.warning("Skipping Textual %s runtime patch: %s", label, exc)
|
|
84
|
+
return False
|
|
85
|
+
staged.install(marker)
|
|
86
|
+
return True
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def members_installed(module: ModuleType, members: Mapping[str, Sequence[str]], marker: str) -> bool:
|
|
90
|
+
"""Whether every function-bearing member of ``members`` on ``module`` already carries ``marker``."""
|
|
91
|
+
functions: list[FunctionType] = []
|
|
92
|
+
for class_name, names in members.items():
|
|
93
|
+
live_class = vars(module).get(class_name)
|
|
94
|
+
if not isinstance(live_class, type):
|
|
95
|
+
return False
|
|
96
|
+
for name in names:
|
|
97
|
+
functions.extend(_functions_of(vars(live_class).get(name)))
|
|
98
|
+
return bool(functions) and all(vars(function).get(marker, False) for function in functions)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def stage_members(
|
|
102
|
+
module: ModuleType,
|
|
103
|
+
patches: Sequence[FilePatch],
|
|
104
|
+
members: Mapping[str, Sequence[str]],
|
|
105
|
+
*,
|
|
106
|
+
label: str,
|
|
107
|
+
classes: Sequence[str] = (),
|
|
108
|
+
) -> StagedMembers:
|
|
109
|
+
"""Compile ``members`` of ``module`` from its installed source with ``patches`` applied.
|
|
110
|
+
|
|
111
|
+
``classes`` names top-level classes the patches add to the module, compiled whole. Raises
|
|
112
|
+
``StagedSourceDriftError`` when a fragment or member no longer matches; nothing is changed
|
|
113
|
+
until ``StagedMembers.install``, so a patch spanning modules can stage them all first.
|
|
114
|
+
"""
|
|
115
|
+
source = stage_patched_source(module, patches)
|
|
116
|
+
return StagedMembers(tuple(_compile_members(module, source, members, label=label, classes=classes)))
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def stage_patched_source(module: ModuleType, patches: Sequence[FilePatch]) -> str:
|
|
120
|
+
"""Return ``module``'s installed source with every fragment of ``patches`` applied."""
|
|
121
|
+
if module.__file__ is None:
|
|
122
|
+
raise StagedSourceDriftError(f"{module.__name__} has no source file")
|
|
123
|
+
source = Path(module.__file__).read_text(encoding="utf-8")
|
|
124
|
+
for patch in patches:
|
|
125
|
+
if patch.new_fragment in source or any(fragment in source for fragment in patch.equivalent_fragments):
|
|
126
|
+
continue
|
|
127
|
+
if patch.old_fragment not in source:
|
|
128
|
+
raise StagedSourceDriftError(f"fragment drifted: {patch.description}")
|
|
129
|
+
source = source.replace(patch.old_fragment, patch.new_fragment, 1)
|
|
130
|
+
return source
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def _member_name(node: ast.stmt) -> str | None:
|
|
134
|
+
if isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef):
|
|
135
|
+
return node.name
|
|
136
|
+
if isinstance(node, ast.Assign) and len(node.targets) == 1 and isinstance(node.targets[0], ast.Name):
|
|
137
|
+
return node.targets[0].id
|
|
138
|
+
if isinstance(node, ast.AnnAssign) and node.value is not None and isinstance(node.target, ast.Name):
|
|
139
|
+
return node.target.id
|
|
140
|
+
return None
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _compile_members(
|
|
144
|
+
module: ModuleType, source: str, members: Mapping[str, Sequence[str]], *, label: str, classes: Sequence[str]
|
|
145
|
+
) -> list[tuple[type | ModuleType, str, object]]:
|
|
146
|
+
tree = ast.parse(source)
|
|
147
|
+
class_nodes = {node.name: node for node in tree.body if isinstance(node, ast.ClassDef)}
|
|
148
|
+
stand_ins: list[ast.stmt] = []
|
|
149
|
+
for class_name in classes:
|
|
150
|
+
class_node = class_nodes.get(class_name)
|
|
151
|
+
if class_node is None:
|
|
152
|
+
raise StagedSourceDriftError(f"class {class_name} is missing")
|
|
153
|
+
stand_ins.append(class_node)
|
|
154
|
+
for class_name, names in members.items():
|
|
155
|
+
class_node = class_nodes.get(class_name)
|
|
156
|
+
if class_node is None:
|
|
157
|
+
raise StagedSourceDriftError(f"class {class_name} is missing")
|
|
158
|
+
body = [node for node in class_node.body if _member_name(node) in names]
|
|
159
|
+
missing = set(names) - {_member_name(node) for node in body}
|
|
160
|
+
if missing:
|
|
161
|
+
raise StagedSourceDriftError(f"{class_name} is missing {sorted(missing)}")
|
|
162
|
+
stand_ins.append(ast.ClassDef(name=class_name, bases=[], keywords=[], body=body, decorator_list=[]))
|
|
163
|
+
code = compile(
|
|
164
|
+
ast.fix_missing_locations(ast.Module(body=stand_ins, type_ignores=[])),
|
|
165
|
+
f"<Chrys {label} patch: {module.__name__}>",
|
|
166
|
+
"exec",
|
|
167
|
+
flags=__future__.annotations.compiler_flag,
|
|
168
|
+
dont_inherit=True,
|
|
169
|
+
)
|
|
170
|
+
namespace: dict[str, object] = {}
|
|
171
|
+
# Globals stay bound to the live module; only the stand-in classes land in ``namespace``.
|
|
172
|
+
exec(code, vars(module), namespace) # noqa: S102
|
|
173
|
+
replacements: list[tuple[type | ModuleType, str, object]] = [
|
|
174
|
+
(module, class_name, namespace[class_name]) for class_name in classes
|
|
175
|
+
]
|
|
176
|
+
for class_name, names in members.items():
|
|
177
|
+
live_class = getattr(module, class_name)
|
|
178
|
+
stand_in = namespace[class_name]
|
|
179
|
+
if not isinstance(live_class, type) or not isinstance(stand_in, type):
|
|
180
|
+
raise StagedSourceDriftError(f"{class_name} is not a class")
|
|
181
|
+
for name in names:
|
|
182
|
+
value = vars(stand_in)[name]
|
|
183
|
+
for function in _functions_of(value):
|
|
184
|
+
_rebind_class_cell(function, live_class)
|
|
185
|
+
replacements.append((live_class, name, value))
|
|
186
|
+
return replacements
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _functions_of(value: object) -> list[FunctionType]:
|
|
190
|
+
if isinstance(value, FunctionType):
|
|
191
|
+
return [value]
|
|
192
|
+
if isinstance(value, property):
|
|
193
|
+
return [function for function in (value.fget, value.fset, value.fdel) if isinstance(function, FunctionType)]
|
|
194
|
+
if isinstance(value, staticmethod | classmethod) and isinstance(value.__func__, FunctionType):
|
|
195
|
+
return [value.__func__]
|
|
196
|
+
if isinstance(value, cached_property) and isinstance(value.func, FunctionType):
|
|
197
|
+
return [value.func]
|
|
198
|
+
return []
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def _rebind_class_cell(function: FunctionType, live_class: type) -> None:
|
|
202
|
+
"""Point a zero-argument ``super()`` (the ``__class__`` cell) at the live class."""
|
|
203
|
+
code = function.__code__
|
|
204
|
+
if "__class__" in code.co_freevars and function.__closure__ is not None:
|
|
205
|
+
function.__closure__[code.co_freevars.index("__class__")].cell_contents = live_class
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Copyright (c) 2021 Will McGugan
|
|
2
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
3
|
+
# Contains code adapted from Textual (MIT License; see NOTICE).
|
|
4
|
+
|
|
5
|
+
"""Patch: use empty style for block border outer when parent bg is terminal default.
|
|
6
|
+
|
|
7
|
+
Problem
|
|
8
|
+
-------
|
|
9
|
+
The ``block`` border type uses half-block characters (▄/▀) whose "other
|
|
10
|
+
half" is rendered with the parent widget's background. When the parent
|
|
11
|
+
background is ``ansi_default``, Textual emits ``Style(bgcolor=default)``
|
|
12
|
+
which Rich renders as ``\\x1b[49m`` (SGR default background). Some
|
|
13
|
+
terminals render this as opaque black instead of true transparent for
|
|
14
|
+
half-block characters, creating visible black lines in block borders.
|
|
15
|
+
|
|
16
|
+
Solution
|
|
17
|
+
--------
|
|
18
|
+
When ``base_background`` is ``ansi_default`` (ansi == -1) or fully
|
|
19
|
+
transparent (a == 0), return an empty ``Style()`` for the outer style.
|
|
20
|
+
An empty style has no bgcolor at all — Rich emits no background escape
|
|
21
|
+
code, letting the terminal render its native background in those cells.
|
|
22
|
+
|
|
23
|
+
Widget imports StylesCache before Chrys bootstrap. Replace the live cached
|
|
24
|
+
method as well, so the first process does not retain the old method or results.
|
|
25
|
+
|
|
26
|
+
The live method also fixes a retention: Textual caches ``get_inner_outer`` per
|
|
27
|
+
instance, so its 1024-entry LRU keeps that many StylesCaches of removed widgets
|
|
28
|
+
alive, each with its rendered lines. The result depends only on the colors, so
|
|
29
|
+
the replacement caches on those alone.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
from __future__ import annotations
|
|
33
|
+
|
|
34
|
+
import logging
|
|
35
|
+
from functools import lru_cache
|
|
36
|
+
from typing import Any
|
|
37
|
+
|
|
38
|
+
from chrys.foundation.patches.patcher import FilePatch, register
|
|
39
|
+
|
|
40
|
+
_RUNTIME_PATCH_MARKER = "_chrys_transparent_block_border"
|
|
41
|
+
_RUNTIME_PATCH_TEXTUAL_VERSION = "8.2.7"
|
|
42
|
+
logger = logging.getLogger(__name__)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def apply_runtime_patch() -> None:
|
|
46
|
+
"""Update already-imported StylesCache classes and discard stale results."""
|
|
47
|
+
try:
|
|
48
|
+
import textual
|
|
49
|
+
from textual._styles_cache import StylesCache
|
|
50
|
+
from textual.style import Style
|
|
51
|
+
except ImportError:
|
|
52
|
+
return
|
|
53
|
+
if textual.__version__ != _RUNTIME_PATCH_TEXTUAL_VERSION:
|
|
54
|
+
logger.warning("Skipping block border patch for unsupported Textual %s", textual.__version__)
|
|
55
|
+
return
|
|
56
|
+
if getattr(StylesCache.get_inner_outer, _RUNTIME_PATCH_MARKER, False):
|
|
57
|
+
return
|
|
58
|
+
|
|
59
|
+
@lru_cache(1024)
|
|
60
|
+
def inner_outer(base_background: Any, background: Any) -> tuple[Any, Any]:
|
|
61
|
+
is_default = getattr(base_background, "ansi", None) == -1
|
|
62
|
+
outer = Style() if (is_default or base_background.a == 0) else Style(background=base_background)
|
|
63
|
+
return Style(background=base_background + background), outer
|
|
64
|
+
|
|
65
|
+
def get_inner_outer(self: Any, base_background: Any, background: Any) -> tuple[Any, Any]:
|
|
66
|
+
return inner_outer(base_background, background)
|
|
67
|
+
|
|
68
|
+
setattr(get_inner_outer, _RUNTIME_PATCH_MARKER, True)
|
|
69
|
+
StylesCache.get_inner_outer = get_inner_outer
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
_OLD = """\
|
|
73
|
+
def get_inner_outer(
|
|
74
|
+
cls, base_background: Color, background: Color
|
|
75
|
+
) -> tuple[Style, Style]:
|
|
76
|
+
\"\"\"Get inner and outer background colors.\"\"\"
|
|
77
|
+
return (
|
|
78
|
+
Style(background=base_background + background),
|
|
79
|
+
Style(background=base_background),
|
|
80
|
+
)"""
|
|
81
|
+
|
|
82
|
+
_NEW = """\
|
|
83
|
+
def get_inner_outer(
|
|
84
|
+
cls, base_background: Color, background: Color
|
|
85
|
+
) -> tuple[Style, Style]:
|
|
86
|
+
\"\"\"Get inner and outer background colors.\"\"\"
|
|
87
|
+
# --- Chrys patch: transparent parent → empty outer style ---
|
|
88
|
+
# When base_background is ansi_default or transparent, emit no
|
|
89
|
+
# bgcolor so the terminal renders its native background.
|
|
90
|
+
is_default = getattr(base_background, "ansi", None) == -1
|
|
91
|
+
outer = Style() if (is_default or base_background.a == 0) else Style(background=base_background)
|
|
92
|
+
return (
|
|
93
|
+
Style(background=base_background + background),
|
|
94
|
+
outer,
|
|
95
|
+
)"""
|
|
96
|
+
|
|
97
|
+
register(
|
|
98
|
+
FilePatch(
|
|
99
|
+
package="textual",
|
|
100
|
+
module_file="_styles_cache.py",
|
|
101
|
+
old_fragment=_OLD,
|
|
102
|
+
new_fragment=_NEW,
|
|
103
|
+
description="Use empty style for block border outer on transparent terminals",
|
|
104
|
+
),
|
|
105
|
+
)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Copyright (c) 2021 Will McGugan
|
|
2
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
3
|
+
# Contains code adapted from Textual (MIT License; see NOTICE).
|
|
4
|
+
|
|
5
|
+
"""Patch: revert the textual 8.2.5 ansi-theme button DEFAULT_CSS block.
|
|
6
|
+
|
|
7
|
+
Problem
|
|
8
|
+
-------
|
|
9
|
+
Textual 8.2.5 added a new ``Button:ansi.-style-flat, Button:ansi.-style-default``
|
|
10
|
+
CSS block to ``Button.DEFAULT_CSS`` which retargets buttons under any
|
|
11
|
+
``ansi=True`` theme (the new ``ansi-dark`` / ``ansi-light`` built-ins, as well
|
|
12
|
+
as chrys' ``chrys-ansi``). The new styling is visually inconsistent with the
|
|
13
|
+
chrys ANSI palette.
|
|
14
|
+
|
|
15
|
+
Solution
|
|
16
|
+
--------
|
|
17
|
+
Strip the new ansi-targeting block back out of ``Button.DEFAULT_CSS`` so
|
|
18
|
+
buttons fall back to the original (pre-8.2.5) rules under ansi themes.
|
|
19
|
+
|
|
20
|
+
Some Chrys TUI modules import ``textual.widgets.Button`` before
|
|
21
|
+
``bootstrap_runtime()`` applies site-package patches, so this module also
|
|
22
|
+
exposes an in-process monkey patch for the already-imported ``Button`` class.
|
|
23
|
+
|
|
24
|
+
The exact 8.2.5 block (whitespace-significant) lives in
|
|
25
|
+
``textual_button_ansi_old.txt`` next to this module, so trailing whitespace
|
|
26
|
+
in the upstream CSS round-trips verbatim through the patcher's literal
|
|
27
|
+
substring match.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
|
|
32
|
+
from chrys.foundation.patches.patcher import FilePatch, register
|
|
33
|
+
|
|
34
|
+
_OLD = (Path(__file__).parent / "textual_button_ansi_old.txt").read_text(encoding="utf-8")
|
|
35
|
+
_NEW = 'DEFAULT_CSS = """\n Button {'
|
|
36
|
+
_RUNTIME_OLD = _OLD.removeprefix('DEFAULT_CSS = """')
|
|
37
|
+
_RUNTIME_NEW = _NEW.removeprefix('DEFAULT_CSS = """')
|
|
38
|
+
_RUNTIME_PATCH_MARKER = "_chrys_textual_button_ansi_css"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def apply_runtime_patch() -> None:
|
|
42
|
+
"""Patch ``Button.DEFAULT_CSS`` in the current process."""
|
|
43
|
+
try:
|
|
44
|
+
from textual.widgets import Button
|
|
45
|
+
except ImportError:
|
|
46
|
+
return
|
|
47
|
+
|
|
48
|
+
if getattr(Button, _RUNTIME_PATCH_MARKER, False):
|
|
49
|
+
return
|
|
50
|
+
|
|
51
|
+
if _RUNTIME_OLD in Button.DEFAULT_CSS:
|
|
52
|
+
Button.DEFAULT_CSS = Button.DEFAULT_CSS.replace(_RUNTIME_OLD, _RUNTIME_NEW, 1)
|
|
53
|
+
|
|
54
|
+
setattr(Button, _RUNTIME_PATCH_MARKER, True)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
register(
|
|
58
|
+
FilePatch(
|
|
59
|
+
package="textual",
|
|
60
|
+
module_file="widgets/_button.py",
|
|
61
|
+
old_fragment=_OLD,
|
|
62
|
+
new_fragment=_NEW,
|
|
63
|
+
description="Revert 8.2.5 ansi-theme button styling block",
|
|
64
|
+
),
|
|
65
|
+
)
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
DEFAULT_CSS = """
|
|
2
|
+
|
|
3
|
+
Button:ansi.-style-flat, Button:ansi.-style-default {
|
|
4
|
+
border: tall $border-blurred;
|
|
5
|
+
background: ansi_default;
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
&:disabled {
|
|
9
|
+
|
|
10
|
+
text-opacity: 1;
|
|
11
|
+
text-style: bold dim;
|
|
12
|
+
border: tall $border-blurred !important;
|
|
13
|
+
# color: initial;
|
|
14
|
+
background: ansi_default !important;
|
|
15
|
+
# text-style: dim;
|
|
16
|
+
pointer: not-allowed;
|
|
17
|
+
&:hover {
|
|
18
|
+
background: ansi_default;
|
|
19
|
+
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
&:hover {
|
|
24
|
+
background: $ansi-background;
|
|
25
|
+
border: tall $border;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
&.-active {
|
|
29
|
+
background: $ansi-background !important;
|
|
30
|
+
border: blank $background !important;
|
|
31
|
+
tint: transparent;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
&.-primary {
|
|
35
|
+
color: $primary;
|
|
36
|
+
border: tall $primary;
|
|
37
|
+
background: ansi_default;
|
|
38
|
+
&:hover {
|
|
39
|
+
background: $ansi-background;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
&.-success {
|
|
43
|
+
color: $success;
|
|
44
|
+
border: tall $success;
|
|
45
|
+
background: ansi_default;
|
|
46
|
+
&:hover {
|
|
47
|
+
background: $ansi-background;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
&.-warning {
|
|
51
|
+
color: $warning;
|
|
52
|
+
border: tall $warning;
|
|
53
|
+
background: ansi_default;
|
|
54
|
+
&:hover {
|
|
55
|
+
background: $ansi-background;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
&.-error {
|
|
59
|
+
color: $error;
|
|
60
|
+
border: tall $error;
|
|
61
|
+
background: ansi_default;
|
|
62
|
+
&:hover {
|
|
63
|
+
background: $ansi-background;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
Button {
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# Copyright (c) 2021 Will McGugan
|
|
2
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
3
|
+
# Contains code adapted from Textual (MIT License; see NOTICE).
|
|
4
|
+
|
|
5
|
+
"""Patch: avoid repeated ``inspect.signature`` calls for Textual callbacks.
|
|
6
|
+
|
|
7
|
+
Textual wraps ``MessagePump.call_later`` / ``call_next`` callbacks in fresh
|
|
8
|
+
``functools.partial`` objects. Textual 8.2.7 tries to cache callback arity on
|
|
9
|
+
the callable itself, but the partial branch calls ``_count_parameters`` on the
|
|
10
|
+
wrapped function directly, bypassing the existing ``count_parameters`` cache.
|
|
11
|
+
|
|
12
|
+
During chat-panel scrolling this repeatedly inspects signatures for the same
|
|
13
|
+
callback functions. Cache the underlying callable recursively and subtract the
|
|
14
|
+
partial arguments from the cached value.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from contextlib import suppress
|
|
20
|
+
from functools import partial
|
|
21
|
+
from inspect import isawaitable
|
|
22
|
+
from typing import Any
|
|
23
|
+
|
|
24
|
+
from chrys.foundation.patches.patcher import FilePatch, register
|
|
25
|
+
|
|
26
|
+
_RUNTIME_PATCH_MARKER = "_chrys_callback_cache_patched"
|
|
27
|
+
|
|
28
|
+
# The runtime wrapper caches arity under its OWN attribute rather than Textual's
|
|
29
|
+
# ``_param_count``. When the wrapper is installed over the *unpatched* upstream
|
|
30
|
+
# function (e.g. before the file patch lands, or in tests against vanilla
|
|
31
|
+
# Textual), upstream may already have cached values with different semantics —
|
|
32
|
+
# vanilla stores the post-subtraction *bound* count on the *unbound* function,
|
|
33
|
+
# which the wrapper's bound-method branch would subtract from a second time. A
|
|
34
|
+
# private attribute keeps the two caches from ever reading each other.
|
|
35
|
+
_PARAM_COUNT_ATTR = "_chrys_param_count"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def apply_runtime_patch() -> None:
|
|
39
|
+
"""Install the callback arity cache fix in the current process."""
|
|
40
|
+
try:
|
|
41
|
+
import textual._callback as callback_mod
|
|
42
|
+
import textual.reactive as reactive_mod
|
|
43
|
+
except ImportError:
|
|
44
|
+
return
|
|
45
|
+
|
|
46
|
+
existing_count_parameters = callback_mod.count_parameters
|
|
47
|
+
if not getattr(existing_count_parameters, _RUNTIME_PATCH_MARKER, False):
|
|
48
|
+
original_count_parameters = existing_count_parameters
|
|
49
|
+
raw_count_parameters = callback_mod._count_parameters
|
|
50
|
+
|
|
51
|
+
def count_parameters(func: Any) -> int:
|
|
52
|
+
"""Count callback parameters while reusing cached underlying arity.
|
|
53
|
+
|
|
54
|
+
Caches under :data:`_PARAM_COUNT_ATTR` rather than Textual's
|
|
55
|
+
``_param_count`` so this wrapper never trusts a value the unpatched
|
|
56
|
+
upstream cached with different semantics (see the constant's note).
|
|
57
|
+
"""
|
|
58
|
+
cache_target = func
|
|
59
|
+
if isinstance(func, partial):
|
|
60
|
+
cached = getattr(func, _PARAM_COUNT_ATTR, None)
|
|
61
|
+
if cached is not None:
|
|
62
|
+
return cached
|
|
63
|
+
keyword_count = len(func.keywords or {})
|
|
64
|
+
param_count = count_parameters(func.func) - (len(func.args) + keyword_count)
|
|
65
|
+
elif hasattr(func, "__self__") and hasattr(func, "__func__"):
|
|
66
|
+
cache_target = func.__func__
|
|
67
|
+
return count_parameters(cache_target) - 1
|
|
68
|
+
else:
|
|
69
|
+
cached = getattr(func, _PARAM_COUNT_ATTR, None)
|
|
70
|
+
if cached is not None:
|
|
71
|
+
return cached
|
|
72
|
+
param_count = raw_count_parameters(func)
|
|
73
|
+
|
|
74
|
+
with suppress(AttributeError, TypeError):
|
|
75
|
+
setattr(cache_target, _PARAM_COUNT_ATTR, param_count)
|
|
76
|
+
return param_count
|
|
77
|
+
|
|
78
|
+
setattr(count_parameters, _RUNTIME_PATCH_MARKER, True)
|
|
79
|
+
count_parameters._original = original_count_parameters
|
|
80
|
+
callback_mod.count_parameters = count_parameters
|
|
81
|
+
|
|
82
|
+
# Reactive imported this function by value before bootstrap. Repair that
|
|
83
|
+
# consumer even on reapplication, when the defining module is already fixed.
|
|
84
|
+
reactive_mod.count_parameters = callback_mod.count_parameters
|
|
85
|
+
|
|
86
|
+
existing_invoke = callback_mod._invoke
|
|
87
|
+
if not getattr(existing_invoke, _RUNTIME_PATCH_MARKER, False):
|
|
88
|
+
original_invoke = existing_invoke
|
|
89
|
+
|
|
90
|
+
async def _invoke(callback: Any, *params: Any) -> Any:
|
|
91
|
+
"""Invoke callbacks without arity introspection when no params are supplied."""
|
|
92
|
+
_rich_traceback_guard = True
|
|
93
|
+
if params:
|
|
94
|
+
parameter_count = callback_mod.count_parameters(callback)
|
|
95
|
+
result = callback(*params[:parameter_count])
|
|
96
|
+
else:
|
|
97
|
+
result = callback()
|
|
98
|
+
if isawaitable(result):
|
|
99
|
+
result = await result
|
|
100
|
+
return result
|
|
101
|
+
|
|
102
|
+
setattr(_invoke, _RUNTIME_PATCH_MARKER, True)
|
|
103
|
+
_invoke._original = original_invoke
|
|
104
|
+
callback_mod._invoke = _invoke
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
_OLD = '''def count_parameters(func: Callable) -> int:
|
|
108
|
+
"""Count the number of parameters in a callable"""
|
|
109
|
+
try:
|
|
110
|
+
return func._param_count
|
|
111
|
+
except AttributeError:
|
|
112
|
+
pass
|
|
113
|
+
if isinstance(func, partial):
|
|
114
|
+
param_count = _count_parameters(func.func) - (
|
|
115
|
+
len(func.args) + len(func.keywords)
|
|
116
|
+
)
|
|
117
|
+
elif hasattr(func, "__self__"):
|
|
118
|
+
# Bound method
|
|
119
|
+
func = func.__func__ # type: ignore
|
|
120
|
+
param_count = _count_parameters(func) - 1
|
|
121
|
+
else:
|
|
122
|
+
param_count = _count_parameters(func)
|
|
123
|
+
try:
|
|
124
|
+
func._param_count = param_count
|
|
125
|
+
except TypeError:
|
|
126
|
+
pass
|
|
127
|
+
return param_count
|
|
128
|
+
'''
|
|
129
|
+
|
|
130
|
+
_NEW = '''def count_parameters(func: Callable) -> int:
|
|
131
|
+
"""Count the number of parameters in a callable"""
|
|
132
|
+
cache_target = func
|
|
133
|
+
if isinstance(func, partial):
|
|
134
|
+
try:
|
|
135
|
+
return func._param_count
|
|
136
|
+
except AttributeError:
|
|
137
|
+
pass
|
|
138
|
+
param_count = count_parameters(func.func) - (
|
|
139
|
+
len(func.args) + len(func.keywords or {})
|
|
140
|
+
)
|
|
141
|
+
elif hasattr(func, "__self__") and hasattr(func, "__func__"):
|
|
142
|
+
# Bound method
|
|
143
|
+
cache_target = func.__func__ # type: ignore
|
|
144
|
+
return count_parameters(cache_target) - 1
|
|
145
|
+
else:
|
|
146
|
+
try:
|
|
147
|
+
return func._param_count
|
|
148
|
+
except AttributeError:
|
|
149
|
+
pass
|
|
150
|
+
param_count = _count_parameters(func)
|
|
151
|
+
try:
|
|
152
|
+
cache_target._param_count = param_count
|
|
153
|
+
except (AttributeError, TypeError):
|
|
154
|
+
pass
|
|
155
|
+
return param_count
|
|
156
|
+
'''
|
|
157
|
+
|
|
158
|
+
_BUGGY_NEW = '''def count_parameters(func: Callable) -> int:
|
|
159
|
+
"""Count the number of parameters in a callable"""
|
|
160
|
+
try:
|
|
161
|
+
return func._param_count
|
|
162
|
+
except AttributeError:
|
|
163
|
+
pass
|
|
164
|
+
cache_target = func
|
|
165
|
+
if isinstance(func, partial):
|
|
166
|
+
param_count = count_parameters(func.func) - (
|
|
167
|
+
len(func.args) + len(func.keywords or {})
|
|
168
|
+
)
|
|
169
|
+
elif hasattr(func, "__self__"):
|
|
170
|
+
# Bound method
|
|
171
|
+
cache_target = func.__func__ # type: ignore
|
|
172
|
+
param_count = count_parameters(cache_target) - 1
|
|
173
|
+
else:
|
|
174
|
+
param_count = _count_parameters(func)
|
|
175
|
+
try:
|
|
176
|
+
cache_target._param_count = param_count
|
|
177
|
+
except (AttributeError, TypeError):
|
|
178
|
+
pass
|
|
179
|
+
return param_count
|
|
180
|
+
'''
|
|
181
|
+
|
|
182
|
+
register(
|
|
183
|
+
FilePatch(
|
|
184
|
+
package="textual",
|
|
185
|
+
module_file="_callback.py",
|
|
186
|
+
old_fragment=_OLD,
|
|
187
|
+
new_fragment=_NEW,
|
|
188
|
+
description="Cache Textual callback arity through partial and bound-method wrappers.",
|
|
189
|
+
equivalent_fragments=(_BUGGY_NEW,),
|
|
190
|
+
)
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
register(
|
|
194
|
+
FilePatch(
|
|
195
|
+
package="textual",
|
|
196
|
+
module_file="_callback.py",
|
|
197
|
+
old_fragment=_BUGGY_NEW,
|
|
198
|
+
new_fragment=_NEW,
|
|
199
|
+
description="Upgrade Textual callback arity cache patch for bound methods.",
|
|
200
|
+
)
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
_OLD_INVOKE = '''async def _invoke(callback: Callable, *params: object) -> Any:
|
|
204
|
+
"""Invoke a callback with an arbitrary number of parameters.
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
callback: The callable to be invoked.
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
The return value of the invoked callable.
|
|
211
|
+
"""
|
|
212
|
+
_rich_traceback_guard = True
|
|
213
|
+
parameter_count = count_parameters(callback)
|
|
214
|
+
result = callback(*params[:parameter_count])
|
|
215
|
+
if isawaitable(result):
|
|
216
|
+
result = await result
|
|
217
|
+
return result
|
|
218
|
+
'''
|
|
219
|
+
|
|
220
|
+
_NEW_INVOKE = '''async def _invoke(callback: Callable, *params: object) -> Any:
|
|
221
|
+
"""Invoke a callback with an arbitrary number of parameters.
|
|
222
|
+
|
|
223
|
+
Args:
|
|
224
|
+
callback: The callable to be invoked.
|
|
225
|
+
|
|
226
|
+
Returns:
|
|
227
|
+
The return value of the invoked callable.
|
|
228
|
+
"""
|
|
229
|
+
_rich_traceback_guard = True
|
|
230
|
+
if params:
|
|
231
|
+
parameter_count = count_parameters(callback)
|
|
232
|
+
result = callback(*params[:parameter_count])
|
|
233
|
+
else:
|
|
234
|
+
result = callback()
|
|
235
|
+
if isawaitable(result):
|
|
236
|
+
result = await result
|
|
237
|
+
return result
|
|
238
|
+
'''
|
|
239
|
+
|
|
240
|
+
register(
|
|
241
|
+
FilePatch(
|
|
242
|
+
package="textual",
|
|
243
|
+
module_file="_callback.py",
|
|
244
|
+
old_fragment=_OLD_INVOKE,
|
|
245
|
+
new_fragment=_NEW_INVOKE,
|
|
246
|
+
description="Skip Textual callback arity inspection when no params are supplied.",
|
|
247
|
+
)
|
|
248
|
+
)
|