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,458 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Current-turn drop round execution and cancellation-drained spilling."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import asyncio
|
|
8
|
+
import logging
|
|
9
|
+
from dataclasses import replace
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import TYPE_CHECKING
|
|
12
|
+
|
|
13
|
+
from chrys.foundation.models.turns import is_continuation_message
|
|
14
|
+
from chrys.foundation.trajectory.metadata import read_analytics_item_id
|
|
15
|
+
from chrys.kernel import Message, annotate_token_counts, included_token_count, set_excluded
|
|
16
|
+
|
|
17
|
+
from .breaker import DropBreakerController
|
|
18
|
+
from .events import _REASON_CURRENT_TURN_DROP, CompactionInfo
|
|
19
|
+
from .exclusions import ExclusionLedger
|
|
20
|
+
from .groups import _tool_call_name
|
|
21
|
+
from .last_words import LastWordsSpendBudgetExceeded
|
|
22
|
+
from .last_words_state import LastWordsState, ManifestEntry
|
|
23
|
+
from .scoped import ScopedGroup, build_scoped_group_timeline
|
|
24
|
+
from .spill import SpillBatchResult, SpillManifestItem, SpillQuota, turn_directory_name, write_spill_batch
|
|
25
|
+
from .turns import _resolve_turns
|
|
26
|
+
|
|
27
|
+
if TYPE_CHECKING:
|
|
28
|
+
from collections.abc import Sequence
|
|
29
|
+
|
|
30
|
+
from chrys.kernel import CompactionCallContext
|
|
31
|
+
|
|
32
|
+
from .strategy import LastWordsGeneratorLike, UnifiedContextStrategy
|
|
33
|
+
|
|
34
|
+
_log = logging.getLogger(__name__)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _consumed_item_ids(groups: Sequence[ScopedGroup]) -> list[str]:
|
|
38
|
+
"""Return the ordered unique stable ids represented by Phase-4 groups."""
|
|
39
|
+
seen: set[str] = set()
|
|
40
|
+
ordered: list[str] = []
|
|
41
|
+
for group in groups:
|
|
42
|
+
for message in group.messages:
|
|
43
|
+
candidates = [
|
|
44
|
+
read_analytics_item_id(message.additional_properties),
|
|
45
|
+
*(read_analytics_item_id(content.additional_properties) for content in message.contents),
|
|
46
|
+
]
|
|
47
|
+
for item_id in candidates:
|
|
48
|
+
if item_id is not None and item_id not in seen:
|
|
49
|
+
seen.add(item_id)
|
|
50
|
+
ordered.append(item_id)
|
|
51
|
+
return ordered
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
async def _write_spill_batch_in_worker(
|
|
55
|
+
session_root: Path | None,
|
|
56
|
+
quota: SpillQuota | None,
|
|
57
|
+
groups: Sequence[ScopedGroup],
|
|
58
|
+
*,
|
|
59
|
+
record_dir: Path,
|
|
60
|
+
absolute_turn: int,
|
|
61
|
+
round_number: int,
|
|
62
|
+
session_id: str,
|
|
63
|
+
superseded_note: str | None = None,
|
|
64
|
+
) -> SpillBatchResult:
|
|
65
|
+
"""Run one spill batch without letting cancellation orphan its writes.
|
|
66
|
+
|
|
67
|
+
``asyncio.to_thread`` cannot stop a thread when its awaiting task is
|
|
68
|
+
cancelled. Drain the owned worker before propagating cancellation so a
|
|
69
|
+
session reset/restore cannot replace the quota lock or mutate the session
|
|
70
|
+
directory while the old batch is still running.
|
|
71
|
+
"""
|
|
72
|
+
worker = asyncio.create_task(
|
|
73
|
+
asyncio.to_thread(
|
|
74
|
+
write_spill_batch,
|
|
75
|
+
session_root,
|
|
76
|
+
quota,
|
|
77
|
+
groups,
|
|
78
|
+
record_dir=record_dir,
|
|
79
|
+
absolute_turn=absolute_turn,
|
|
80
|
+
round_number=round_number,
|
|
81
|
+
session_id=session_id,
|
|
82
|
+
superseded_note=superseded_note,
|
|
83
|
+
)
|
|
84
|
+
)
|
|
85
|
+
try:
|
|
86
|
+
return await asyncio.shield(worker)
|
|
87
|
+
except asyncio.CancelledError:
|
|
88
|
+
# Repeated interrupts must not detach the same worker. Each shield is
|
|
89
|
+
# a fresh waiter; the underlying task remains owned until it settles.
|
|
90
|
+
while not worker.done():
|
|
91
|
+
try:
|
|
92
|
+
await asyncio.shield(worker)
|
|
93
|
+
except asyncio.CancelledError:
|
|
94
|
+
continue
|
|
95
|
+
except Exception:
|
|
96
|
+
break
|
|
97
|
+
if not worker.cancelled():
|
|
98
|
+
try:
|
|
99
|
+
worker.result()
|
|
100
|
+
except Exception:
|
|
101
|
+
_log.debug("Spill worker failed while its caller was cancelled", exc_info=True)
|
|
102
|
+
raise
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class CurrentTurnDropRound:
|
|
106
|
+
"""Execute the final current-turn drop stage against live strategy state."""
|
|
107
|
+
|
|
108
|
+
def __init__(
|
|
109
|
+
self,
|
|
110
|
+
strategy: UnifiedContextStrategy,
|
|
111
|
+
breaker: DropBreakerController,
|
|
112
|
+
ledger: ExclusionLedger,
|
|
113
|
+
) -> None:
|
|
114
|
+
self._strategy = strategy
|
|
115
|
+
self._breaker = breaker
|
|
116
|
+
self._ledger = ledger
|
|
117
|
+
|
|
118
|
+
async def _generate_last_words(
|
|
119
|
+
self,
|
|
120
|
+
timeline_groups: list[ScopedGroup],
|
|
121
|
+
previous: str | None,
|
|
122
|
+
*,
|
|
123
|
+
degraded_opener: bool,
|
|
124
|
+
has_continuation_nudges: bool,
|
|
125
|
+
context: CompactionCallContext | None,
|
|
126
|
+
generator: LastWordsGeneratorLike,
|
|
127
|
+
last_words: LastWordsState,
|
|
128
|
+
) -> str:
|
|
129
|
+
# max() folds the retained legacy ``tool_definition_tokens`` spelling.
|
|
130
|
+
request_overhead_tokens = (
|
|
131
|
+
max(context.request_overhead_tokens, context.tool_definition_tokens) if context is not None else 0
|
|
132
|
+
)
|
|
133
|
+
failure_recorded = False
|
|
134
|
+
try:
|
|
135
|
+
new_last_words = await generator.generate(
|
|
136
|
+
timeline_groups,
|
|
137
|
+
previous,
|
|
138
|
+
degraded_opener=degraded_opener,
|
|
139
|
+
has_continuation_nudges=has_continuation_nudges,
|
|
140
|
+
completer=context.last_words_completer if context is not None else None,
|
|
141
|
+
tokenizer=self._strategy.tokenizer,
|
|
142
|
+
system_overhead_tokens=self._strategy.system_overhead_tokens,
|
|
143
|
+
request_overhead_tokens=request_overhead_tokens,
|
|
144
|
+
calibration_ratio=self._strategy.calibration_ratio,
|
|
145
|
+
spend_side_call_tokens=self._breaker.spend_side_call_tokens,
|
|
146
|
+
)
|
|
147
|
+
except LastWordsSpendBudgetExceeded:
|
|
148
|
+
breaker = self._breaker.record_no_progress("side_call_budget")
|
|
149
|
+
if breaker is not None and not breaker.disabled:
|
|
150
|
+
disabled = replace(breaker, disabled=True)
|
|
151
|
+
last_words.set_drop_round_breaker(disabled)
|
|
152
|
+
self._breaker.emit_context_pressure("side_call_budget", disabled)
|
|
153
|
+
failure_recorded = True
|
|
154
|
+
_log.warning("Phase 4 side-call spend budget exhausted; retaining current-turn groups")
|
|
155
|
+
new_last_words = ""
|
|
156
|
+
except Exception:
|
|
157
|
+
self._breaker.record_no_progress("generation_failure")
|
|
158
|
+
raise
|
|
159
|
+
if not new_last_words and not failure_recorded:
|
|
160
|
+
self._breaker.record_no_progress("generation_failure")
|
|
161
|
+
return new_last_words
|
|
162
|
+
|
|
163
|
+
async def _spill_drop_groups(
|
|
164
|
+
self,
|
|
165
|
+
drop_groups: list[ScopedGroup],
|
|
166
|
+
*,
|
|
167
|
+
absolute_turn: int,
|
|
168
|
+
round_number: int,
|
|
169
|
+
previous: str | None,
|
|
170
|
+
) -> tuple[SpillBatchResult, bool]:
|
|
171
|
+
record_dir = self._strategy._spill_record_dir / turn_directory_name(absolute_turn)
|
|
172
|
+
spill_result = await _write_spill_batch_in_worker(
|
|
173
|
+
self._strategy._spill_root,
|
|
174
|
+
self._strategy._spill_quota,
|
|
175
|
+
drop_groups,
|
|
176
|
+
record_dir=record_dir,
|
|
177
|
+
absolute_turn=absolute_turn,
|
|
178
|
+
round_number=round_number,
|
|
179
|
+
session_id=self._strategy._spill_session_id,
|
|
180
|
+
# The merge that authorized this drop replaces
|
|
181
|
+
# ``previous``; archive that pre-merge original
|
|
182
|
+
# verbatim alongside the round's group records.
|
|
183
|
+
superseded_note=previous or None,
|
|
184
|
+
)
|
|
185
|
+
spill_permitted = True
|
|
186
|
+
if spill_result.unexpected_io_failure:
|
|
187
|
+
spill_permitted = False
|
|
188
|
+
if self._strategy._persist_recovery_now is not None:
|
|
189
|
+
try:
|
|
190
|
+
spill_permitted = (await self._strategy._persist_recovery_now()) is True
|
|
191
|
+
except Exception:
|
|
192
|
+
_log.warning(
|
|
193
|
+
"Phase 4 recovery persistence failed after spill I/O error",
|
|
194
|
+
exc_info=True,
|
|
195
|
+
)
|
|
196
|
+
if not spill_permitted:
|
|
197
|
+
self._breaker.record_no_progress("spill_abort")
|
|
198
|
+
_log.warning("Phase 4 spill I/O failure was not durably checkpointed; retaining groups")
|
|
199
|
+
return spill_result, spill_permitted
|
|
200
|
+
|
|
201
|
+
async def run(
|
|
202
|
+
self,
|
|
203
|
+
messages: list[Message],
|
|
204
|
+
context: CompactionCallContext | None,
|
|
205
|
+
) -> bool:
|
|
206
|
+
"""Run one Phase-4 pipeline stage."""
|
|
207
|
+
changed = False
|
|
208
|
+
|
|
209
|
+
# ---- Phase 4: Drop ALL current-turn tool calls + inline agent text ----
|
|
210
|
+
# One shot: collect every current-turn group that is still included,
|
|
211
|
+
# hand them to the LAST_WORDS LLM summariser, exclude them, and set
|
|
212
|
+
# the updated note on the LAST_WORDS state, whose reminder is appended
|
|
213
|
+
# to the user message on every subsequent LLM call until the turn ends.
|
|
214
|
+
# Generator failures (SDK error, empty response) are retried inside
|
|
215
|
+
# the generator against the same LAST_WORDS prompt — we never drop
|
|
216
|
+
# current-turn work without a note in hand.
|
|
217
|
+
p4_count = 0
|
|
218
|
+
p4_tool_names: list[str] = []
|
|
219
|
+
p4_consumed_item_ids: list[str] = []
|
|
220
|
+
p4_last_words_generated = False
|
|
221
|
+
p4_tokens_before = included_token_count(messages)
|
|
222
|
+
|
|
223
|
+
if self._strategy._usage_pct(p4_tokens_before) > self._strategy.target_pct:
|
|
224
|
+
# Resolve fresh at this call site against the post-P3 lists.
|
|
225
|
+
resolved = _resolve_turns(messages, self._strategy._state)
|
|
226
|
+
current_span = resolved.current
|
|
227
|
+
current_turn = (current_span.start, current_span.end) if current_span is not None else (0, len(messages))
|
|
228
|
+
timeline = build_scoped_group_timeline(
|
|
229
|
+
messages,
|
|
230
|
+
span_start=current_turn[0],
|
|
231
|
+
span_end=current_turn[1],
|
|
232
|
+
degraded=resolved.degraded,
|
|
233
|
+
)
|
|
234
|
+
current_groups = [group.group_id for group in timeline.groups if group.kind not in ("user", "system")]
|
|
235
|
+
|
|
236
|
+
# Phase 4 only fires when there is at least one tool-call group
|
|
237
|
+
# to drop — otherwise there is nothing meaningful to summarise
|
|
238
|
+
# and dropping plain assistant text alone would lose content
|
|
239
|
+
# without replacing it.
|
|
240
|
+
has_tool_call = any(group.kind == "tool_call" for group in timeline.groups)
|
|
241
|
+
|
|
242
|
+
if current_groups and has_tool_call:
|
|
243
|
+
reminder_middleware = self._strategy._reminder_middleware
|
|
244
|
+
last_words_state = self._strategy._last_words_state
|
|
245
|
+
last_words_generator = self._strategy._last_words_generator
|
|
246
|
+
if last_words_generator is None or reminder_middleware is None or last_words_state is None:
|
|
247
|
+
_log.warning(
|
|
248
|
+
"Phase 4 SKIPPED drop: fresh-note collaborators unbound "
|
|
249
|
+
"(reminder_middleware=%s, last_words_state=%s, last_words_generator=%s)",
|
|
250
|
+
"bound" if reminder_middleware is not None else "None",
|
|
251
|
+
"bound" if last_words_state is not None else "None",
|
|
252
|
+
"bound" if last_words_generator is not None else "None",
|
|
253
|
+
)
|
|
254
|
+
else:
|
|
255
|
+
# Step 1: synchronous entry check and attempt count, before
|
|
256
|
+
# hooks, preflight, or either side-call path.
|
|
257
|
+
breaker_at_entry, trip_reason = self._breaker.enter_round()
|
|
258
|
+
if breaker_at_entry is None:
|
|
259
|
+
await self._breaker.publish_trip(trip_reason)
|
|
260
|
+
else:
|
|
261
|
+
entry_usage_pct = self._strategy._usage_pct(p4_tokens_before)
|
|
262
|
+
await self._strategy._fire_pre_compact(
|
|
263
|
+
"phase4",
|
|
264
|
+
usage_pct=entry_usage_pct,
|
|
265
|
+
tokens_before=p4_tokens_before,
|
|
266
|
+
)
|
|
267
|
+
drop_groups = [group for group in timeline.groups if group.kind not in ("user", "system")]
|
|
268
|
+
p4_consumed_item_ids = _consumed_item_ids(drop_groups)
|
|
269
|
+
for group in drop_groups:
|
|
270
|
+
if group.kind == "tool_call":
|
|
271
|
+
p4_tool_names.extend(
|
|
272
|
+
tool_name
|
|
273
|
+
for message in group.messages
|
|
274
|
+
for content in message.contents
|
|
275
|
+
if (tool_name := _tool_call_name(content))
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
# Step 2: only a non-empty note produced by THIS round
|
|
279
|
+
# authorizes the later drop. A stale note is inherited
|
|
280
|
+
# input, never authorization for a new delta.
|
|
281
|
+
previous = last_words_state.get_last_words()
|
|
282
|
+
has_continuation_nudges = any(
|
|
283
|
+
is_continuation_message(message) for group in timeline.groups for message in group.messages
|
|
284
|
+
)
|
|
285
|
+
new_last_words = await self._generate_last_words(
|
|
286
|
+
list(timeline.groups),
|
|
287
|
+
previous,
|
|
288
|
+
degraded_opener=timeline.degraded_opener,
|
|
289
|
+
has_continuation_nudges=has_continuation_nudges,
|
|
290
|
+
context=context,
|
|
291
|
+
generator=last_words_generator,
|
|
292
|
+
last_words=last_words_state,
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
if new_last_words:
|
|
296
|
+
# Step 3: worker-thread spill, including catalog
|
|
297
|
+
# append+flush and catalog-only manifest projection.
|
|
298
|
+
absolute_turn = current_span.absolute_number if current_span is not None else 1
|
|
299
|
+
spill_result, spill_permitted = await self._spill_drop_groups(
|
|
300
|
+
drop_groups,
|
|
301
|
+
absolute_turn=absolute_turn,
|
|
302
|
+
round_number=breaker_at_entry.attempts,
|
|
303
|
+
previous=previous,
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
if spill_permitted:
|
|
307
|
+
manifest_entries = [self._manifest_entry(item) for item in spill_result.entries]
|
|
308
|
+
|
|
309
|
+
# Steps 4-5: synchronous commit through
|
|
310
|
+
# exclusion and the post-round usage sample.
|
|
311
|
+
# Do not insert an await anywhere in this block.
|
|
312
|
+
last_words_state.mark_manifest_records_unavailable(spill_result.evicted_relative_paths)
|
|
313
|
+
last_words_state.set_last_words(new_last_words)
|
|
314
|
+
last_words_state.append_manifest(manifest_entries)
|
|
315
|
+
p4_last_words_generated = True
|
|
316
|
+
reminder_middleware.refresh_last_words_reminder(messages)
|
|
317
|
+
annotate_token_counts(
|
|
318
|
+
messages,
|
|
319
|
+
tokenizer=self._strategy.tokenizer,
|
|
320
|
+
force_retokenize=True,
|
|
321
|
+
)
|
|
322
|
+
changed = True
|
|
323
|
+
|
|
324
|
+
for group in drop_groups:
|
|
325
|
+
any_changed = False
|
|
326
|
+
for message in group.messages:
|
|
327
|
+
any_changed = (
|
|
328
|
+
set_excluded(
|
|
329
|
+
message,
|
|
330
|
+
excluded=True,
|
|
331
|
+
reason=_REASON_CURRENT_TURN_DROP,
|
|
332
|
+
)
|
|
333
|
+
or any_changed
|
|
334
|
+
)
|
|
335
|
+
if any_changed:
|
|
336
|
+
self._ledger._removed_group_ids.add(group.group_id)
|
|
337
|
+
p4_count += 1
|
|
338
|
+
post_p4_tokens = included_token_count(messages)
|
|
339
|
+
self._breaker.record_progress(
|
|
340
|
+
entry_usage_pct,
|
|
341
|
+
self._strategy._usage_pct(post_p4_tokens),
|
|
342
|
+
)
|
|
343
|
+
# Anchor/token bookkeeping must also land
|
|
344
|
+
# inside the synchronous commit: the awaits
|
|
345
|
+
# that follow (committed publish,
|
|
346
|
+
# on_compaction) honor cancellation, and an
|
|
347
|
+
# interrupt that observed exclusions without
|
|
348
|
+
# anchors would resume retaining both the
|
|
349
|
+
# original history and the note.
|
|
350
|
+
self._strategy._last_included_tokens = post_p4_tokens
|
|
351
|
+
self._ledger.snapshot_excluded_anchors(messages)
|
|
352
|
+
# The round is now durably applied; tell
|
|
353
|
+
# observers that count real compactions
|
|
354
|
+
# (the finished-ok signal fired pre-commit
|
|
355
|
+
# and can belong to an abandoned round).
|
|
356
|
+
try:
|
|
357
|
+
await last_words_generator.publish_committed()
|
|
358
|
+
except asyncio.CancelledError:
|
|
359
|
+
# The commit above is durable, but the
|
|
360
|
+
# end-of-pass on_compaction notification
|
|
361
|
+
# (ToolCompacted for the main agent)
|
|
362
|
+
# would be skipped by the cancellation —
|
|
363
|
+
# deliver it on a detached task before
|
|
364
|
+
# propagating, covering the rounds
|
|
365
|
+
# committed so far this pass.
|
|
366
|
+
self._schedule_detached_on_compaction(
|
|
367
|
+
CompactionInfo(
|
|
368
|
+
compacted_groups=p4_count,
|
|
369
|
+
phase="phase4",
|
|
370
|
+
turn_numbers=[current_span.absolute_number]
|
|
371
|
+
if current_span is not None
|
|
372
|
+
else [],
|
|
373
|
+
tool_names=p4_tool_names,
|
|
374
|
+
tokens_before=p4_tokens_before,
|
|
375
|
+
tokens_after=post_p4_tokens,
|
|
376
|
+
last_words_generated=True,
|
|
377
|
+
consumed_item_ids=p4_consumed_item_ids,
|
|
378
|
+
)
|
|
379
|
+
)
|
|
380
|
+
raise
|
|
381
|
+
|
|
382
|
+
if p4_count > 0 or p4_last_words_generated:
|
|
383
|
+
# The rounds this reports are already durably committed, so
|
|
384
|
+
# the delivery itself must survive cancellation for the
|
|
385
|
+
# whole await window, not just inside publish_committed
|
|
386
|
+
# above: run it as an anchored task behind a shield —
|
|
387
|
+
# cancellation still propagates to the caller, but the
|
|
388
|
+
# ToolCompacted delivery finishes detached.
|
|
389
|
+
delivery = self._schedule_detached_on_compaction(
|
|
390
|
+
CompactionInfo(
|
|
391
|
+
compacted_groups=p4_count,
|
|
392
|
+
phase="phase4",
|
|
393
|
+
turn_numbers=[current_span.absolute_number] if current_span is not None else [],
|
|
394
|
+
tool_names=p4_tool_names,
|
|
395
|
+
tokens_before=p4_tokens_before,
|
|
396
|
+
tokens_after=included_token_count(messages),
|
|
397
|
+
last_words_generated=p4_last_words_generated,
|
|
398
|
+
consumed_item_ids=p4_consumed_item_ids,
|
|
399
|
+
)
|
|
400
|
+
)
|
|
401
|
+
await asyncio.shield(delivery)
|
|
402
|
+
|
|
403
|
+
return changed
|
|
404
|
+
|
|
405
|
+
@staticmethod
|
|
406
|
+
def _manifest_entry(item: SpillManifestItem) -> ManifestEntry:
|
|
407
|
+
return ManifestEntry(
|
|
408
|
+
record_id=item.record_id,
|
|
409
|
+
group_id=item.group_id,
|
|
410
|
+
record_dir=item.record_dir,
|
|
411
|
+
relative_path=item.relative_path,
|
|
412
|
+
turn=item.turn,
|
|
413
|
+
round=item.round,
|
|
414
|
+
sequence=item.sequence,
|
|
415
|
+
tool=item.tool,
|
|
416
|
+
display_argument=item.display_argument,
|
|
417
|
+
outcome=item.outcome,
|
|
418
|
+
size_chars=item.size_chars,
|
|
419
|
+
assistant_text=item.assistant_text,
|
|
420
|
+
available=item.available,
|
|
421
|
+
no_record_reason=item.no_record_reason,
|
|
422
|
+
)
|
|
423
|
+
|
|
424
|
+
def _schedule_detached_on_compaction(self, info: CompactionInfo) -> asyncio.Future:
|
|
425
|
+
"""Record the phase now; hand the observer callback to a detached task.
|
|
426
|
+
|
|
427
|
+
The pass around this call can close its run before a task started here
|
|
428
|
+
gets to write — it may not have run at all yet, or be waiting on the
|
|
429
|
+
ack of the phase's opening line while the pass unwinds — and the phase
|
|
430
|
+
(or the tail of a segmented one) would land behind the run's own
|
|
431
|
+
terminal marker. Queued here it cannot.
|
|
432
|
+
"""
|
|
433
|
+
run = self._strategy._trajectory_run
|
|
434
|
+
if run is not None:
|
|
435
|
+
run.phase_finished_soon(
|
|
436
|
+
phase=info.phase,
|
|
437
|
+
groups_compacted=info.compacted_groups,
|
|
438
|
+
turn_numbers=info.turn_numbers,
|
|
439
|
+
tool_names=info.tool_names,
|
|
440
|
+
tokens_before=info.tokens_before,
|
|
441
|
+
tokens_after=info.tokens_after,
|
|
442
|
+
last_words_generated=info.last_words_generated,
|
|
443
|
+
consumed_item_ids=info.consumed_item_ids,
|
|
444
|
+
)
|
|
445
|
+
# No run: the phase above already carries it, and only the observer
|
|
446
|
+
# callback is left to deliver.
|
|
447
|
+
task = asyncio.ensure_future(self._strategy._notify_compaction_for_run(info, None))
|
|
448
|
+
self._strategy._detached_deliveries.add(task)
|
|
449
|
+
task.add_done_callback(self._discard_detached_delivery)
|
|
450
|
+
return task
|
|
451
|
+
|
|
452
|
+
def _discard_detached_delivery(self, task: asyncio.Future) -> None:
|
|
453
|
+
self._strategy._detached_deliveries.discard(task)
|
|
454
|
+
if task.cancelled():
|
|
455
|
+
return
|
|
456
|
+
exc = task.exception()
|
|
457
|
+
if exc is not None:
|
|
458
|
+
_log.debug("Detached on_compaction delivery failed", exc_info=exc)
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Compaction event payloads, shared value types, and exclusion reasons."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
import weakref
|
|
9
|
+
from dataclasses import dataclass, field
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from chrys.kernel import Message
|
|
13
|
+
from chrys.kernel.identity import WeakIdentityRegistry
|
|
14
|
+
|
|
15
|
+
_log = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
# Exclude reasons set by this compaction strategy's _compact_group (Phase 1)
|
|
18
|
+
# and _remove_group (Phase 2/3). Used to recognise flags that were persisted
|
|
19
|
+
# from a prior session and should not be cleared on session restore.
|
|
20
|
+
_REASON_COMPACTION = "budget_tool_compaction"
|
|
21
|
+
_REASON_REMOVAL = "budget_tool_removal"
|
|
22
|
+
_REASON_CURRENT_TURN_DROP = "current_turn_drop"
|
|
23
|
+
_REASON_COMPRESSION = "cross_turn_compression"
|
|
24
|
+
_COMPACTION_EXCLUDE_REASONS = frozenset(
|
|
25
|
+
{_REASON_COMPACTION, _REASON_REMOVAL, _REASON_CURRENT_TURN_DROP, _REASON_COMPRESSION}
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
# ---------------------------------------------------------------------------
|
|
29
|
+
# Compaction info
|
|
30
|
+
# ---------------------------------------------------------------------------
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass(frozen=True)
|
|
34
|
+
class CompactionInfo:
|
|
35
|
+
"""Details about an intra-turn compaction round, passed to the on_compaction callback."""
|
|
36
|
+
|
|
37
|
+
compacted_groups: int
|
|
38
|
+
"""Number of tool-call groups that were compacted."""
|
|
39
|
+
|
|
40
|
+
phase: str = ""
|
|
41
|
+
"""Which phase: ``"phase1"`` to ``"phase4"`` (see module docstring)."""
|
|
42
|
+
|
|
43
|
+
turn_numbers: list[int] = field(default_factory=list)
|
|
44
|
+
"""Absolute turn numbers affected (phases 1/2: compacted previous
|
|
45
|
+
turns; phase 4: the current turn)."""
|
|
46
|
+
|
|
47
|
+
tool_names: list[str] = field(default_factory=list)
|
|
48
|
+
"""Tool names from compacted groups (may contain duplicates across groups)."""
|
|
49
|
+
|
|
50
|
+
tokens_before: int = 0
|
|
51
|
+
"""Estimated included token count before compaction."""
|
|
52
|
+
|
|
53
|
+
tokens_after: int = 0
|
|
54
|
+
"""Estimated included token count after compaction."""
|
|
55
|
+
|
|
56
|
+
last_words_generated: bool = False
|
|
57
|
+
"""True when phase 4 produced/updated a LAST_WORDS progress note."""
|
|
58
|
+
|
|
59
|
+
consumed_item_ids: list[str] = field(default_factory=list)
|
|
60
|
+
"""Stable item ids folded into the Phase-4 note before the next wire request."""
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@dataclass(frozen=True)
|
|
64
|
+
class PreCompactInfo:
|
|
65
|
+
"""Details about a compaction phase before it mutates context."""
|
|
66
|
+
|
|
67
|
+
trigger: str
|
|
68
|
+
"""Which phase is about to run: ``"phase1"`` to ``"phase4"``, or ``"force"``."""
|
|
69
|
+
|
|
70
|
+
usage_pct: float
|
|
71
|
+
"""Estimated context usage fraction at the phase boundary."""
|
|
72
|
+
|
|
73
|
+
tokens_before: int = 0
|
|
74
|
+
"""Estimated included token count before the phase runs."""
|
|
75
|
+
|
|
76
|
+
trajectory_operation_id: str | None = None
|
|
77
|
+
"""Compaction container targeted by blocking hooks, when already open."""
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@dataclass(frozen=True)
|
|
81
|
+
class CompressInfo:
|
|
82
|
+
"""Details about a cross-turn context compression, passed to the on_compress callback."""
|
|
83
|
+
|
|
84
|
+
compressed_context_id: str
|
|
85
|
+
"""Unique identifier for the compressed block."""
|
|
86
|
+
|
|
87
|
+
summary: str = ""
|
|
88
|
+
"""Agent-provided summary of the compressed content."""
|
|
89
|
+
|
|
90
|
+
freed_messages: int = 0
|
|
91
|
+
"""Number of messages that were folded into the compressed block."""
|
|
92
|
+
|
|
93
|
+
turn_range: tuple[int, int] = (0, 0)
|
|
94
|
+
"""Inclusive backend turn range folded into the compressed block."""
|
|
95
|
+
|
|
96
|
+
source: str = "agent"
|
|
97
|
+
"""What initiated the compression: ``"agent"`` (LLM called compress_context) or ``"auto"`` (platform)."""
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _compressed_turn_range(state: dict[str, Any] | None, compressed_context_id: str) -> tuple[int, int]:
|
|
101
|
+
"""Return the persisted turn range for a just-created compressed block."""
|
|
102
|
+
if state is None:
|
|
103
|
+
return (0, 0)
|
|
104
|
+
compressed_blocks = state.get("compressed_msgs")
|
|
105
|
+
if not isinstance(compressed_blocks, list):
|
|
106
|
+
return (0, 0)
|
|
107
|
+
|
|
108
|
+
from chrys.service.context.providers.history import CompressedBlock
|
|
109
|
+
|
|
110
|
+
for block in reversed(compressed_blocks):
|
|
111
|
+
if isinstance(block, CompressedBlock) and block.compressed_context_id == compressed_context_id:
|
|
112
|
+
return block.turn_range
|
|
113
|
+
return (0, 0)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
@dataclass
|
|
117
|
+
class PendingCompression:
|
|
118
|
+
"""A queued cross-turn compression request from the ``compress_context`` tool.
|
|
119
|
+
|
|
120
|
+
Created by :meth:`UnifiedContextStrategy.queue_compression`, processed
|
|
121
|
+
inside :meth:`UnifiedContextStrategy.__call__` on FunctionInvocationLayer's message list.
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
compressed_context_id: str
|
|
125
|
+
"""Pre-generated ID, returned to the tool caller immediately."""
|
|
126
|
+
|
|
127
|
+
marker_id: str
|
|
128
|
+
"""The turn marker to fold up to."""
|
|
129
|
+
|
|
130
|
+
summary_text: str
|
|
131
|
+
"""Agent-provided summary."""
|
|
132
|
+
|
|
133
|
+
freed_count: int = 0
|
|
134
|
+
"""Pre-computed count of messages in the fold range."""
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
@dataclass(frozen=True)
|
|
138
|
+
class CachedSummary:
|
|
139
|
+
"""A Phase 1 tool-result summary, cached for defensive re-injection.
|
|
140
|
+
|
|
141
|
+
The active tool loop keeps inserted summaries on its message list.
|
|
142
|
+
Chrys still caches summaries so copied or replayed lists that retain
|
|
143
|
+
``_summarized_by_summary_id`` on excluded originals can be reconstructed.
|
|
144
|
+
Stored in :attr:`UnifiedContextStrategy._summary_cache`, keyed by
|
|
145
|
+
a unique occurrence ``summary_id`` (``"tool_summary_<item_id>"``),
|
|
146
|
+
independent of positional group and message IDs.
|
|
147
|
+
"""
|
|
148
|
+
|
|
149
|
+
summary_text: str
|
|
150
|
+
"""The compacted summary text shown in place of the full tool result."""
|
|
151
|
+
|
|
152
|
+
original_ids: list[str]
|
|
153
|
+
"""Message IDs of the original tool-call group members being summarised."""
|
|
154
|
+
|
|
155
|
+
group_id: str
|
|
156
|
+
"""ID of the tool-call group this summary replaces."""
|
|
157
|
+
|
|
158
|
+
item_id: str
|
|
159
|
+
"""Stable occurrence identity shared by wire, stored and re-injected summaries."""
|
|
160
|
+
|
|
161
|
+
message: Message
|
|
162
|
+
"""Summary contents and write-through metadata, without retaining original messages."""
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
@dataclass(frozen=True)
|
|
166
|
+
class CachedCompressedContextSummary:
|
|
167
|
+
"""A cross-turn compressed-context summary cached for same-run re-injection.
|
|
168
|
+
|
|
169
|
+
Identity snapshots are WEAK registries held across calls: an entry lives
|
|
170
|
+
exactly as long as its object, so a garbage-collected original simply
|
|
171
|
+
stops matching — its recycled id can never false-match fresh wire
|
|
172
|
+
content — and the cache never keeps the folded originals alive.
|
|
173
|
+
"""
|
|
174
|
+
|
|
175
|
+
summary_message: Message
|
|
176
|
+
"""The compressed-context summary inserted into state."""
|
|
177
|
+
|
|
178
|
+
folded_contents: WeakIdentityRegistry
|
|
179
|
+
"""Weak identities of the original folded messages' contents lists."""
|
|
180
|
+
|
|
181
|
+
folded_summary_ids: frozenset[str]
|
|
182
|
+
"""Stable summary occurrence references belonging to folded messages."""
|
|
183
|
+
|
|
184
|
+
folded_content_objects: WeakIdentityRegistry
|
|
185
|
+
"""Weak identities of the folded messages' content OBJECTS.
|
|
186
|
+
|
|
187
|
+
Matches the kernel wire's per-call message views, whose fresh contents
|
|
188
|
+
lists defeat ``folded_contents``; the content objects stay shared.
|
|
189
|
+
Usage contents are deliberately included — fold evidence must keep
|
|
190
|
+
seeing them.
|
|
191
|
+
"""
|
|
192
|
+
|
|
193
|
+
folded_messages: tuple[weakref.ref[Message], ...]
|
|
194
|
+
"""Weak references to the folded state messages themselves.
|
|
195
|
+
|
|
196
|
+
Matches the reminder middleware's enriched user messages, which carry
|
|
197
|
+
fresh contents and share only the original's ``additional_properties``
|
|
198
|
+
dict. A plain dict can't be weakly referenced, so the dicts are read off
|
|
199
|
+
the still-live originals at match time; their ids are therefore always
|
|
200
|
+
those of live objects.
|
|
201
|
+
"""
|