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,146 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Runtime skill refresh helpers for main-agent turns."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import copy
|
|
8
|
+
import logging
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
from chrys.foundation.events.types import AgentRuntimeUpdated, Warning
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from chrys.foundation.events.bus import EventBus
|
|
16
|
+
from chrys.foundation.events.types import RuntimeSkillDetails
|
|
17
|
+
from chrys.orchestration.engine.build.loaded import AgentManifest
|
|
18
|
+
from chrys.orchestration.engine.loader import AgentLoader
|
|
19
|
+
from chrys.orchestration.engine.state.active_session import ActiveSession
|
|
20
|
+
from chrys.orchestration.engine.state.current_agent import CurrentAgent
|
|
21
|
+
from chrys.service.skills.model import SkillProviderWarning
|
|
22
|
+
from chrys.service.skills.provider import ChrysSkillsProvider, StagedSkillRefresh
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass(frozen=True)
|
|
29
|
+
class StagedRuntimeSkillRefresh:
|
|
30
|
+
"""Runtime skill refresh staged before an active-injection owner is revalidated."""
|
|
31
|
+
|
|
32
|
+
provider: ChrysSkillsProvider
|
|
33
|
+
context: StagedSkillRefresh
|
|
34
|
+
warnings: list[SkillProviderWarning]
|
|
35
|
+
skill_names: list[str]
|
|
36
|
+
skill_sources: dict[str, list[str]]
|
|
37
|
+
skill_details: list[RuntimeSkillDetails]
|
|
38
|
+
skill_catalog: str | None
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclass(frozen=True)
|
|
42
|
+
class CommittedSkillRefresh:
|
|
43
|
+
"""Warnings and the exact manifest installed by one synchronous refresh commit."""
|
|
44
|
+
|
|
45
|
+
warnings: list[SkillProviderWarning]
|
|
46
|
+
manifest: AgentManifest
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class RuntimeSkillRefresher:
|
|
50
|
+
"""Refresh runtime skills through the engine host."""
|
|
51
|
+
|
|
52
|
+
def __init__(
|
|
53
|
+
self,
|
|
54
|
+
*,
|
|
55
|
+
current: CurrentAgent,
|
|
56
|
+
loader: AgentLoader,
|
|
57
|
+
session: ActiveSession,
|
|
58
|
+
bus: EventBus,
|
|
59
|
+
) -> None:
|
|
60
|
+
self._current = current
|
|
61
|
+
self._loader = loader
|
|
62
|
+
self._session = session
|
|
63
|
+
self._bus = bus
|
|
64
|
+
|
|
65
|
+
async def refresh(self, *, update_active_turn: bool = False) -> None:
|
|
66
|
+
"""Refresh runtime skills and optionally update the active reminder snapshot."""
|
|
67
|
+
session_id = self._session.session_id
|
|
68
|
+
staged = await self.stage_refresh()
|
|
69
|
+
if staged is None:
|
|
70
|
+
return
|
|
71
|
+
committed = self.commit_staged_refresh(staged, suppress_provider_errors=True)
|
|
72
|
+
if committed is None:
|
|
73
|
+
return
|
|
74
|
+
await self.publish_committed_refresh(committed, session_id=session_id)
|
|
75
|
+
if update_active_turn and self._current.loaded is not None:
|
|
76
|
+
self._current.loaded.reminder_middleware.update_skill_catalog_for_active_turn()
|
|
77
|
+
|
|
78
|
+
async def stage_refresh(self) -> StagedRuntimeSkillRefresh | None:
|
|
79
|
+
"""Discover runtime skills without mutating live provider or host runtime state."""
|
|
80
|
+
provider = self._current.loaded.skills_provider if self._current.loaded is not None else None
|
|
81
|
+
if provider is None:
|
|
82
|
+
return None
|
|
83
|
+
try:
|
|
84
|
+
staged = await provider.stage_context_refresh()
|
|
85
|
+
except Exception:
|
|
86
|
+
logger.exception("Failed to stage runtime skill refresh")
|
|
87
|
+
return None
|
|
88
|
+
return StagedRuntimeSkillRefresh(
|
|
89
|
+
provider=provider,
|
|
90
|
+
context=staged,
|
|
91
|
+
warnings=list(staged.warnings),
|
|
92
|
+
skill_names=staged.skill_names(),
|
|
93
|
+
skill_sources=staged.skill_sources(),
|
|
94
|
+
skill_details=staged.skill_details(),
|
|
95
|
+
skill_catalog=staged.render_catalog_reminder(),
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
def commit_staged_refresh(
|
|
99
|
+
self,
|
|
100
|
+
staged: StagedRuntimeSkillRefresh | None,
|
|
101
|
+
*,
|
|
102
|
+
suppress_provider_errors: bool = False,
|
|
103
|
+
) -> CommittedSkillRefresh | None:
|
|
104
|
+
"""Commit a staged runtime skill refresh synchronously to the captured owner."""
|
|
105
|
+
if staged is None:
|
|
106
|
+
return None
|
|
107
|
+
try:
|
|
108
|
+
warnings = staged.provider.commit_context_refresh(staged.context)
|
|
109
|
+
except Exception:
|
|
110
|
+
if not suppress_provider_errors:
|
|
111
|
+
raise
|
|
112
|
+
logger.exception("Failed to refresh runtime skills")
|
|
113
|
+
return None
|
|
114
|
+
manifest = self._loader.apply_skill_refresh(
|
|
115
|
+
skill_names=list(staged.skill_names),
|
|
116
|
+
skill_sources={source: list(names) for source, names in staged.skill_sources.items()},
|
|
117
|
+
skill_details=list(staged.skill_details),
|
|
118
|
+
)
|
|
119
|
+
return CommittedSkillRefresh(warnings=warnings, manifest=manifest)
|
|
120
|
+
|
|
121
|
+
async def publish_committed_refresh(
|
|
122
|
+
self,
|
|
123
|
+
committed: CommittedSkillRefresh | None,
|
|
124
|
+
*,
|
|
125
|
+
session_id: str | None,
|
|
126
|
+
) -> None:
|
|
127
|
+
"""Publish captured warnings and manifest values for one committed refresh."""
|
|
128
|
+
if committed is None:
|
|
129
|
+
return
|
|
130
|
+
for warning in committed.warnings:
|
|
131
|
+
await self._bus.publish(Warning(code=warning.code, message=warning.message, session_id=session_id))
|
|
132
|
+
await self._publish_runtime_update(committed.manifest, session_id=session_id)
|
|
133
|
+
|
|
134
|
+
async def _publish_runtime_update(self, manifest: AgentManifest, *, session_id: str | None) -> None:
|
|
135
|
+
"""Publish the current runtime catalog."""
|
|
136
|
+
await self._bus.publish(
|
|
137
|
+
AgentRuntimeUpdated(
|
|
138
|
+
session_id=session_id,
|
|
139
|
+
model_profile_id=manifest.runtime_details.model.profile_id,
|
|
140
|
+
max_context_tokens=manifest.runtime_details.model.max_context_tokens,
|
|
141
|
+
tool_names=list(manifest.tool_names),
|
|
142
|
+
skill_names=list(manifest.skill_names),
|
|
143
|
+
memory_files=list(manifest.memory_files),
|
|
144
|
+
runtime_details=copy.deepcopy(manifest.runtime_details),
|
|
145
|
+
)
|
|
146
|
+
)
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Engine-internal sub-agent pause coordination."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from typing import TYPE_CHECKING
|
|
9
|
+
|
|
10
|
+
from chrys.orchestration.engine.state.machine import Trigger
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from chrys.foundation.events.types import (
|
|
14
|
+
InvocationAborted,
|
|
15
|
+
InvocationAbortRequested,
|
|
16
|
+
InvocationCascadeAborted,
|
|
17
|
+
InvocationPaused,
|
|
18
|
+
InvocationResumed,
|
|
19
|
+
InvocationRetryRequested,
|
|
20
|
+
)
|
|
21
|
+
from chrys.orchestration.engine.run.turn_state import TurnRuntimeState
|
|
22
|
+
from chrys.orchestration.engine.state.current_agent import CurrentAgent
|
|
23
|
+
from chrys.orchestration.engine.state.machine import EngineStateMachine
|
|
24
|
+
from chrys.orchestration.engine.trajectory import TrajectoryRecorder
|
|
25
|
+
from chrys.service.session.history import SessionHistoryManager
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
logger = logging.getLogger(__name__)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
async def on_sub_agent_retry(current: CurrentAgent, event: InvocationRetryRequested) -> None:
|
|
32
|
+
"""Route a user's per-card Retry click to the owning controller."""
|
|
33
|
+
if current.loaded is None or current.loaded.sub_agent_tools is None:
|
|
34
|
+
return
|
|
35
|
+
current.loaded.sub_agent_tools.request_retry(event.invocation_id)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
async def on_sub_agent_abort(current: CurrentAgent, event: InvocationAbortRequested) -> None:
|
|
39
|
+
"""Route a user's per-card Abort click to the owning controller."""
|
|
40
|
+
if current.loaded is None or current.loaded.sub_agent_tools is None:
|
|
41
|
+
return
|
|
42
|
+
current.loaded.sub_agent_tools.request_abort(event.invocation_id)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
async def on_sub_agent_paused(
|
|
46
|
+
turn_state: TurnRuntimeState,
|
|
47
|
+
history: SessionHistoryManager,
|
|
48
|
+
fsm: EngineStateMachine,
|
|
49
|
+
trajectory_recorder: TrajectoryRecorder,
|
|
50
|
+
event: InvocationPaused,
|
|
51
|
+
) -> None:
|
|
52
|
+
"""Track a newly paused sub-agent and drive FSM / marker.
|
|
53
|
+
|
|
54
|
+
Idempotent on the paused set — if the same id arrives twice
|
|
55
|
+
(controller re-publishes after retry exhaustion, for example)
|
|
56
|
+
the FSM transition only fires on the 0→1 edge.
|
|
57
|
+
|
|
58
|
+
Defensive FSM guard: if the parent run has already terminated
|
|
59
|
+
(e.g. the bus is dispatching a stale pause event that was queued
|
|
60
|
+
before the parent's task was cancelled and ``_post_run`` ran),
|
|
61
|
+
drop the event silently rather than re-inserting a marker on top
|
|
62
|
+
of an already-terminal ``interrupted``/``error`` marker. The
|
|
63
|
+
parent invariant ("parent run ends only after all sub-agents
|
|
64
|
+
resolve") should make this unreachable, but defense in depth
|
|
65
|
+
keeps history well-formed if that invariant ever breaks.
|
|
66
|
+
"""
|
|
67
|
+
if event.origin.kind != "sub_agent" or event.origin.root.kind == "workflow_node":
|
|
68
|
+
return
|
|
69
|
+
if not fsm.is_running():
|
|
70
|
+
logger.debug(
|
|
71
|
+
"Ignoring InvocationPaused for %s: FSM=%s (parent run already terminated)",
|
|
72
|
+
event.origin.invocation_id,
|
|
73
|
+
fsm.state.name,
|
|
74
|
+
)
|
|
75
|
+
return
|
|
76
|
+
first = not turn_state.paused_sub_agents
|
|
77
|
+
turn_state.paused_sub_agents.add(event.origin.invocation_id)
|
|
78
|
+
if first:
|
|
79
|
+
fsm.try_transition(Trigger.SUB_AGENT_PAUSED)
|
|
80
|
+
await trajectory_recorder.turn_suspended()
|
|
81
|
+
if history.is_bound:
|
|
82
|
+
history.upsert_awaiting_sub_agents_marker(sorted(turn_state.paused_sub_agents))
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
async def on_sub_agent_unpaused(
|
|
86
|
+
turn_state: TurnRuntimeState,
|
|
87
|
+
history: SessionHistoryManager,
|
|
88
|
+
fsm: EngineStateMachine,
|
|
89
|
+
trajectory_recorder: TrajectoryRecorder,
|
|
90
|
+
event: InvocationResumed | InvocationAborted | InvocationCascadeAborted,
|
|
91
|
+
) -> None:
|
|
92
|
+
"""Common handler — retry/abort/cascade all remove the invocation from the paused set.
|
|
93
|
+
|
|
94
|
+
FSM transitions only on the N→0 edge (last paused sub-agent
|
|
95
|
+
resolved). Marker is updated or stripped accordingly.
|
|
96
|
+
"""
|
|
97
|
+
if event.origin.kind != "sub_agent" or event.origin.root.kind == "workflow_node":
|
|
98
|
+
return
|
|
99
|
+
if event.origin.invocation_id not in turn_state.paused_sub_agents:
|
|
100
|
+
return
|
|
101
|
+
turn_state.paused_sub_agents.discard(event.origin.invocation_id)
|
|
102
|
+
if not turn_state.paused_sub_agents:
|
|
103
|
+
fsm.try_transition(Trigger.SUB_AGENT_RESOLVED)
|
|
104
|
+
await trajectory_recorder.turn_resumed()
|
|
105
|
+
if history.is_bound:
|
|
106
|
+
history.remove_awaiting_sub_agents_marker()
|
|
107
|
+
elif history.is_bound:
|
|
108
|
+
history.upsert_awaiting_sub_agents_marker(sorted(turn_state.paused_sub_agents))
|
|
109
|
+
# Defensive invariant: FSM ``AWAITING_SUB_AGENTS`` must mirror a
|
|
110
|
+
# non-empty paused set. A desync here would mean either a stale
|
|
111
|
+
# pause event leaked past the ``_fsm.is_running()`` guard in
|
|
112
|
+
# ``_on_sub_agent_paused`` or a ``try_transition`` silently no-op'd.
|
|
113
|
+
# Log instead of raising so a surprise in production doesn't crash
|
|
114
|
+
# the engine mid-run — the log points straight at the bug.
|
|
115
|
+
if bool(turn_state.paused_sub_agents) != fsm.is_awaiting_sub_agents():
|
|
116
|
+
logger.error(
|
|
117
|
+
"FSM/paused-set desync: paused=%s FSM=%s",
|
|
118
|
+
sorted(turn_state.paused_sub_agents),
|
|
119
|
+
fsm.state.name,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def clear_parent_paused_state(turn_state: TurnRuntimeState, history: SessionHistoryManager) -> None:
|
|
124
|
+
"""Clear engine-side paused sub-agent state after a parent run ends."""
|
|
125
|
+
turn_state.paused_sub_agents.clear()
|
|
126
|
+
history.remove_awaiting_sub_agents_marker()
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Lifecycle hook dispatch helpers for main-agent turns."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import asyncio
|
|
8
|
+
import logging
|
|
9
|
+
from typing import TYPE_CHECKING
|
|
10
|
+
|
|
11
|
+
from chrys.foundation.events.types import Error
|
|
12
|
+
from chrys.foundation.i18n import msg
|
|
13
|
+
from chrys.foundation.platform import safe_getcwd
|
|
14
|
+
from chrys.service.hooks.events import HookEvent
|
|
15
|
+
from chrys.service.hooks.schema import HookDecision
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from chrys.foundation.events.bus import EventBus
|
|
19
|
+
from chrys.foundation.trajectory.context import TrajectoryContext
|
|
20
|
+
from chrys.orchestration.engine.state.active_session import ActiveSession
|
|
21
|
+
from chrys.orchestration.engine.state.current_agent import CurrentAgent
|
|
22
|
+
from chrys.orchestration.engine.state.machine import EngineStateMachine
|
|
23
|
+
from chrys.service.context.compaction import PreCompactInfo
|
|
24
|
+
from chrys.service.hooks.manager import HookManager
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
_TURN_HOOKS_PROMPT_BLOCKED = msg(
|
|
30
|
+
"turn_hooks.prompt_blocked",
|
|
31
|
+
fallback="Prompt blocked by hook.",
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class TurnHookDispatcher:
|
|
36
|
+
"""Dispatch non-prompt turn lifecycle hooks."""
|
|
37
|
+
|
|
38
|
+
def __init__(
|
|
39
|
+
self,
|
|
40
|
+
*,
|
|
41
|
+
session: ActiveSession,
|
|
42
|
+
current: CurrentAgent,
|
|
43
|
+
) -> None:
|
|
44
|
+
self._session = session
|
|
45
|
+
self._current = current
|
|
46
|
+
self._pending: set[asyncio.Task[None]] = set()
|
|
47
|
+
|
|
48
|
+
async def fire_before_turn(
|
|
49
|
+
self,
|
|
50
|
+
user_text: str,
|
|
51
|
+
*,
|
|
52
|
+
is_retry: bool = False,
|
|
53
|
+
target_operation_id: str | None = None,
|
|
54
|
+
) -> None:
|
|
55
|
+
"""Publish a ``before_turn`` hook event."""
|
|
56
|
+
if self._session.hook_manager is None or not self._session.hook_manager.has_hooks_for(HookEvent.BEFORE_TURN):
|
|
57
|
+
return
|
|
58
|
+
profile_name = self._session.agent_profile.name if self._session.agent_profile is not None else ""
|
|
59
|
+
await self._session.hook_manager.fire(
|
|
60
|
+
HookEvent.BEFORE_TURN,
|
|
61
|
+
{
|
|
62
|
+
"session_id": self._session.session_id,
|
|
63
|
+
"profile": profile_name,
|
|
64
|
+
"cwd": _workspace_cwd(self._session),
|
|
65
|
+
"turn": self._session.turn_number,
|
|
66
|
+
"user_text": user_text,
|
|
67
|
+
"is_retry": is_retry,
|
|
68
|
+
},
|
|
69
|
+
target_operation_id=target_operation_id,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
async def fire_after_turn(self, *, failed: bool) -> None:
|
|
73
|
+
"""Publish an ``after_turn`` hook event."""
|
|
74
|
+
if self._session.hook_manager is None or not self._session.hook_manager.has_hooks_for(HookEvent.AFTER_TURN):
|
|
75
|
+
return
|
|
76
|
+
profile_name = self._session.agent_profile.name if self._session.agent_profile is not None else ""
|
|
77
|
+
status = (
|
|
78
|
+
"failed"
|
|
79
|
+
if (self._current.loaded is not None and self._current.loaded.bindings.state.run_failed)
|
|
80
|
+
else (
|
|
81
|
+
"interrupted"
|
|
82
|
+
if (self._current.loaded is not None and self._current.loaded.bindings.state.was_interrupted)
|
|
83
|
+
else "ok"
|
|
84
|
+
)
|
|
85
|
+
)
|
|
86
|
+
await self._session.hook_manager.fire(
|
|
87
|
+
HookEvent.AFTER_TURN,
|
|
88
|
+
{
|
|
89
|
+
"session_id": self._session.session_id,
|
|
90
|
+
"profile": profile_name,
|
|
91
|
+
"cwd": _workspace_cwd(self._session),
|
|
92
|
+
"turn": self._session.turn_number,
|
|
93
|
+
"status": status,
|
|
94
|
+
"failed": failed,
|
|
95
|
+
},
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
def schedule_user_interrupt(self) -> None:
|
|
99
|
+
"""Schedule observer dispatch with the interrupt's session identity."""
|
|
100
|
+
manager = self._session.hook_manager
|
|
101
|
+
if manager is None or not manager.has_hooks_for(HookEvent.USER_INTERRUPT):
|
|
102
|
+
return
|
|
103
|
+
session_id = self._session.session_id
|
|
104
|
+
profile_name = self._session.agent_profile.name if self._session.agent_profile is not None else ""
|
|
105
|
+
cwd = _workspace_cwd(self._session)
|
|
106
|
+
task = asyncio.create_task(
|
|
107
|
+
self.fire_user_interrupt(manager, session_id=session_id, profile_name=profile_name, cwd=cwd)
|
|
108
|
+
)
|
|
109
|
+
self._pending.add(task)
|
|
110
|
+
task.add_done_callback(self._pending.discard)
|
|
111
|
+
task.add_done_callback(self.log_user_interrupt_hook_error)
|
|
112
|
+
|
|
113
|
+
async def fire_user_interrupt(
|
|
114
|
+
self,
|
|
115
|
+
manager: HookManager,
|
|
116
|
+
*,
|
|
117
|
+
session_id: str | None,
|
|
118
|
+
profile_name: str,
|
|
119
|
+
cwd: str,
|
|
120
|
+
) -> None:
|
|
121
|
+
"""Publish an interrupt hook using only its captured manager and identity."""
|
|
122
|
+
await manager.fire(
|
|
123
|
+
HookEvent.USER_INTERRUPT,
|
|
124
|
+
{"session_id": session_id, "profile": profile_name, "cwd": cwd},
|
|
125
|
+
scope="detached",
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
@staticmethod
|
|
129
|
+
def log_user_interrupt_hook_error(task: asyncio.Task[None]) -> None:
|
|
130
|
+
"""Log a failed background interrupt-hook dispatch."""
|
|
131
|
+
try:
|
|
132
|
+
task.result()
|
|
133
|
+
except asyncio.CancelledError:
|
|
134
|
+
pass
|
|
135
|
+
except Exception:
|
|
136
|
+
logger.exception("user_interrupt hook dispatch failed")
|
|
137
|
+
|
|
138
|
+
async def fire_pre_compact(self, info: PreCompactInfo) -> None:
|
|
139
|
+
"""Callback from UnifiedContextStrategy — fire pre_compact hooks."""
|
|
140
|
+
if self._session.hook_manager is None:
|
|
141
|
+
return
|
|
142
|
+
from chrys.service.hooks.events import HookEvent
|
|
143
|
+
|
|
144
|
+
if not self._session.hook_manager.has_hooks_for(HookEvent.PRE_COMPACT):
|
|
145
|
+
return
|
|
146
|
+
profile_name = self._session.agent_profile.name if self._session.agent_profile is not None else ""
|
|
147
|
+
await self._session.hook_manager.fire(
|
|
148
|
+
HookEvent.PRE_COMPACT,
|
|
149
|
+
{
|
|
150
|
+
"session_id": self._session.session_id,
|
|
151
|
+
"profile": profile_name,
|
|
152
|
+
"cwd": self._session.workspace_cwd(),
|
|
153
|
+
"trigger": info.trigger,
|
|
154
|
+
"usage_pct": info.usage_pct,
|
|
155
|
+
"tokens_before": info.tokens_before,
|
|
156
|
+
},
|
|
157
|
+
target_operation_id=info.trajectory_operation_id,
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class PromptSubmitGate:
|
|
162
|
+
"""Evaluate ``user_prompt_submit`` hooks and apply accepted reminders."""
|
|
163
|
+
|
|
164
|
+
def __init__(
|
|
165
|
+
self,
|
|
166
|
+
*,
|
|
167
|
+
session: ActiveSession,
|
|
168
|
+
current: CurrentAgent,
|
|
169
|
+
bus: EventBus,
|
|
170
|
+
fsm: EngineStateMachine,
|
|
171
|
+
) -> None:
|
|
172
|
+
self._session = session
|
|
173
|
+
self._current = current
|
|
174
|
+
self._bus = bus
|
|
175
|
+
self._fsm = fsm
|
|
176
|
+
|
|
177
|
+
async def fire(self, text: str, *, injected: bool | None = None) -> bool:
|
|
178
|
+
"""Return True when a blocking hook denied the prompt."""
|
|
179
|
+
decision = await self.evaluate(text, injected=injected)
|
|
180
|
+
if await self.handle_decision(decision, injected=injected):
|
|
181
|
+
return True
|
|
182
|
+
self.queue_reminders(decision, injected=injected)
|
|
183
|
+
return False
|
|
184
|
+
|
|
185
|
+
async def evaluate(
|
|
186
|
+
self,
|
|
187
|
+
text: str,
|
|
188
|
+
*,
|
|
189
|
+
injected: bool | None,
|
|
190
|
+
target_operation_id: str | None = None,
|
|
191
|
+
trajectory_context: TrajectoryContext | None = None,
|
|
192
|
+
) -> HookDecision | None:
|
|
193
|
+
"""Run ``user_prompt_submit`` hooks without applying reminder side effects."""
|
|
194
|
+
if self._session.hook_manager is None or not self._session.hook_manager.has_hooks_for(
|
|
195
|
+
HookEvent.USER_PROMPT_SUBMIT
|
|
196
|
+
):
|
|
197
|
+
return None
|
|
198
|
+
profile_name = self._session.agent_profile.name if self._session.agent_profile is not None else ""
|
|
199
|
+
is_injected = self._fsm.is_running() if injected is None else injected
|
|
200
|
+
return await self._session.hook_manager.fire(
|
|
201
|
+
HookEvent.USER_PROMPT_SUBMIT,
|
|
202
|
+
{
|
|
203
|
+
"session_id": self._session.session_id,
|
|
204
|
+
"profile": profile_name,
|
|
205
|
+
"cwd": _workspace_cwd(self._session),
|
|
206
|
+
"text": text,
|
|
207
|
+
"injected": is_injected,
|
|
208
|
+
},
|
|
209
|
+
target_operation_id=target_operation_id,
|
|
210
|
+
trajectory_context=trajectory_context,
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
async def handle_decision(
|
|
214
|
+
self,
|
|
215
|
+
decision: HookDecision | None,
|
|
216
|
+
*,
|
|
217
|
+
injected: bool | None,
|
|
218
|
+
session_id: str | None = None,
|
|
219
|
+
) -> bool:
|
|
220
|
+
"""Return True after publishing when a prompt-submit hook blocked."""
|
|
221
|
+
_ = injected
|
|
222
|
+
if decision is None:
|
|
223
|
+
return False
|
|
224
|
+
if not decision.blocked:
|
|
225
|
+
return False
|
|
226
|
+
await self._bus.publish(
|
|
227
|
+
Error(
|
|
228
|
+
code="hook_blocked",
|
|
229
|
+
message=decision.block_reason or "Prompt blocked by hook.",
|
|
230
|
+
display_message=None if decision.block_reason else _TURN_HOOKS_PROMPT_BLOCKED.bind(),
|
|
231
|
+
session_id=self._session.session_id if session_id is None else session_id,
|
|
232
|
+
)
|
|
233
|
+
)
|
|
234
|
+
return True
|
|
235
|
+
|
|
236
|
+
def queue_reminders(self, decision: HookDecision | None, *, injected: bool | None) -> None:
|
|
237
|
+
"""Apply non-blocking prompt-submit hook reminders after prompt validation passes."""
|
|
238
|
+
if decision is None or not decision.system_reminders or self._current.loaded is None:
|
|
239
|
+
return
|
|
240
|
+
is_injected = self._fsm.is_running() if injected is None else injected
|
|
241
|
+
self._current.loaded.reminder_middleware.queue_hook_reminders(
|
|
242
|
+
decision.system_reminders,
|
|
243
|
+
for_next_turn=not is_injected,
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
@staticmethod
|
|
247
|
+
def reminder_texts(decision: HookDecision | None) -> list[str]:
|
|
248
|
+
"""Return non-empty prompt-hook reminders from an accepted decision."""
|
|
249
|
+
if decision is None:
|
|
250
|
+
return []
|
|
251
|
+
return [reminder for reminder in decision.system_reminders if reminder]
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def _workspace_cwd(session: ActiveSession) -> str:
|
|
255
|
+
"""Return the current workspace cwd, falling back only before workspace initialization."""
|
|
256
|
+
if session.workspace is not None:
|
|
257
|
+
return session.workspace.primary_cwd
|
|
258
|
+
return safe_getcwd()
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Turn-specific recovery input and injection state, borrowing an ExecutionLease."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import asyncio
|
|
8
|
+
from dataclasses import dataclass, field
|
|
9
|
+
from datetime import datetime
|
|
10
|
+
from typing import TYPE_CHECKING, Any, Literal
|
|
11
|
+
|
|
12
|
+
from chrys.foundation.models.turns import UserMessageKind
|
|
13
|
+
from chrys.orchestration.engine.execution import ExecutionLease, RunTaskDrainOutcome
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from chrys.orchestration.engine.execution import CurrentRunInjectionWindow, CurrentRunScope
|
|
17
|
+
from chrys.orchestration.engine.run.bindings import TurnBindings
|
|
18
|
+
from chrys.orchestration.invoker.kernel import KernelConversation
|
|
19
|
+
from chrys.service.agent_middleware.system_reminder import CurrentRunReminderTarget, SystemReminderMiddleware
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass
|
|
23
|
+
class CurrentTurnInput:
|
|
24
|
+
"""Current prompt data used by crash-recovery checkpoint writes.
|
|
25
|
+
|
|
26
|
+
``kind`` records how a recovery checkpoint must re-create the message
|
|
27
|
+
(``"opener"`` unflagged, ``"injected"`` flagged mid-turn input) — see
|
|
28
|
+
:func:`chrys.foundation.models.turns.user_text_matches`. Empty-input
|
|
29
|
+
resumes clear this field; opener replay registers the popped anchor.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
text: str = ""
|
|
33
|
+
contents: list[Any] | None = None
|
|
34
|
+
created_at: datetime | str | None = None
|
|
35
|
+
kind: UserMessageKind = "opener"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass(frozen=True)
|
|
39
|
+
class ActiveInjectionTarget:
|
|
40
|
+
"""Operation-local target captured before awaited active-injection work."""
|
|
41
|
+
|
|
42
|
+
route: Literal["fsm_active", "executor_fallback"]
|
|
43
|
+
session_id: str | None
|
|
44
|
+
session_generation: int
|
|
45
|
+
build_generation: int
|
|
46
|
+
current_run_scope: CurrentRunScope
|
|
47
|
+
run_task: asyncio.Task[None]
|
|
48
|
+
bindings: TurnBindings
|
|
49
|
+
conversation: KernelConversation
|
|
50
|
+
reminder_middleware: SystemReminderMiddleware
|
|
51
|
+
reminder_target: CurrentRunReminderTarget
|
|
52
|
+
injection_window: CurrentRunInjectionWindow
|
|
53
|
+
trajectory_turn_id: str | None = None
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class TurnRuntimeState:
|
|
58
|
+
"""Turn product state; lease owns the unique task and all lifetime fences."""
|
|
59
|
+
|
|
60
|
+
lease: ExecutionLease = field(default_factory=ExecutionLease)
|
|
61
|
+
current_input: CurrentTurnInput = field(default_factory=CurrentTurnInput)
|
|
62
|
+
|
|
63
|
+
paused_sub_agents: set[str] = field(default_factory=set)
|
|
64
|
+
shutdown_used_cancel_fallback: bool = False
|
|
65
|
+
|
|
66
|
+
history_start_index: int = 0
|
|
67
|
+
|
|
68
|
+
cancelled_injection_ids: set[str] = field(default_factory=set)
|
|
69
|
+
|
|
70
|
+
inflight_injection_ids: dict[str, int] = field(default_factory=dict)
|
|
71
|
+
|
|
72
|
+
async def drain_for_boundary(self) -> RunTaskDrainOutcome:
|
|
73
|
+
"""Observe the active run-task chain for a rebuild/session boundary."""
|
|
74
|
+
return await self.lease.observe_run_task_chain(propagate_inner_cancel=False)
|
|
75
|
+
|
|
76
|
+
def begin_inflight_injection(self, injection_id: str | None) -> None:
|
|
77
|
+
"""Track one in-flight admission of a frontend-identified injection.
|
|
78
|
+
|
|
79
|
+
While an id is tracked, a user cancel for it is recorded as a mark
|
|
80
|
+
(:meth:`mark_injection_cancelled`) that the admission observes at its
|
|
81
|
+
cancellation checkpoints. No-op for id-less submits.
|
|
82
|
+
"""
|
|
83
|
+
if not injection_id:
|
|
84
|
+
return
|
|
85
|
+
self.inflight_injection_ids[injection_id] = self.inflight_injection_ids.get(injection_id, 0) + 1
|
|
86
|
+
|
|
87
|
+
def finish_inflight_injection(self, injection_id: str | None) -> None:
|
|
88
|
+
"""Stop tracking one in-flight admission for *injection_id*.
|
|
89
|
+
|
|
90
|
+
When the last admission for the id exits, any cancel mark it did not
|
|
91
|
+
observe (e.g. the admission aborted for an unrelated reason first) is
|
|
92
|
+
dropped with it — nothing can observe the mark afterwards.
|
|
93
|
+
"""
|
|
94
|
+
if not injection_id:
|
|
95
|
+
return
|
|
96
|
+
count = self.inflight_injection_ids.get(injection_id, 0)
|
|
97
|
+
if count > 1:
|
|
98
|
+
self.inflight_injection_ids[injection_id] = count - 1
|
|
99
|
+
return
|
|
100
|
+
self.inflight_injection_ids.pop(injection_id, None)
|
|
101
|
+
self.cancelled_injection_ids.discard(injection_id)
|
|
102
|
+
|
|
103
|
+
def is_injection_inflight(self, injection_id: str) -> bool:
|
|
104
|
+
"""Return whether an admission for *injection_id* is currently in flight."""
|
|
105
|
+
return injection_id in self.inflight_injection_ids
|
|
106
|
+
|
|
107
|
+
def mark_injection_cancelled(self, injection_id: str) -> None:
|
|
108
|
+
"""Record a user cancel for an injection whose admission is in flight.
|
|
109
|
+
|
|
110
|
+
Callers must only mark ids that something can still observe (an
|
|
111
|
+
in-flight admission — see :meth:`is_injection_inflight`); the mark is
|
|
112
|
+
consumed at the admission's next cancellation checkpoint and dropped
|
|
113
|
+
at admission end otherwise, so it can never outlive its injection.
|
|
114
|
+
"""
|
|
115
|
+
self.cancelled_injection_ids.add(injection_id)
|
|
116
|
+
|
|
117
|
+
def is_injection_cancelled(self, injection_id: str | None) -> bool:
|
|
118
|
+
"""Return whether *injection_id* carries an unconsumed cancel mark."""
|
|
119
|
+
return injection_id is not None and injection_id in self.cancelled_injection_ids
|
|
120
|
+
|
|
121
|
+
def discard_injection_cancellation(self, injection_id: str | None) -> bool:
|
|
122
|
+
"""Consume the cancel mark for *injection_id*; returns whether it was set."""
|
|
123
|
+
if injection_id is None or injection_id not in self.cancelled_injection_ids:
|
|
124
|
+
return False
|
|
125
|
+
self.cancelled_injection_ids.discard(injection_id)
|
|
126
|
+
return True
|
|
127
|
+
|
|
128
|
+
def set_current_input(
|
|
129
|
+
self,
|
|
130
|
+
text: str,
|
|
131
|
+
contents: list[Any] | None,
|
|
132
|
+
created_at: datetime | str | None,
|
|
133
|
+
kind: UserMessageKind = "opener",
|
|
134
|
+
) -> None:
|
|
135
|
+
"""Set current prompt data for recovery checkpointing."""
|
|
136
|
+
self.current_input = CurrentTurnInput(text=text, contents=contents, created_at=created_at, kind=kind)
|
|
137
|
+
|
|
138
|
+
def clear_current_input(self) -> None:
|
|
139
|
+
"""Clear current prompt data after run finalization."""
|
|
140
|
+
self.current_input = CurrentTurnInput()
|
|
141
|
+
|
|
142
|
+
def reset_after_session_shutdown(self, *, prompt_admission_owner: str | None = None) -> CurrentRunScope | None:
|
|
143
|
+
"""Reset Turn-only data after the execution owner has drained and reset."""
|
|
144
|
+
old_scope = self.lease.reset_after_session_shutdown(prompt_admission_owner=prompt_admission_owner)
|
|
145
|
+
self.current_input = CurrentTurnInput()
|
|
146
|
+
self.history_start_index = 0
|
|
147
|
+
self.cancelled_injection_ids.clear()
|
|
148
|
+
self.inflight_injection_ids.clear()
|
|
149
|
+
return old_scope
|