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,343 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Prepared, conversation and pass resources with a single close authority.
|
|
4
|
+
|
|
5
|
+
Close tasks stay reachable through their owner until every release has run.
|
|
6
|
+
Cancellation of a waiter cannot orphan the displaced build or cancel another
|
|
7
|
+
close waiter. A release's own cancellation is remembered and re-raised after
|
|
8
|
+
the remaining releases, matching the build transaction's former cleanup chain.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import asyncio
|
|
14
|
+
import logging
|
|
15
|
+
from collections.abc import Awaitable, Callable, Coroutine
|
|
16
|
+
from typing import Any
|
|
17
|
+
|
|
18
|
+
from chrys.foundation.util.once_close import finish_close
|
|
19
|
+
|
|
20
|
+
from .attempts import AttemptTaskHandle
|
|
21
|
+
from .contracts import AbortCause, OperationBinding, PreparedClosed, Unbind
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
type Release = Callable[[], Awaitable[object]]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
async def rollback_resources(owner: ResourceScope) -> None:
|
|
29
|
+
"""Complete rollback, preserving any new cancellation of its caller.
|
|
30
|
+
|
|
31
|
+
aclose/finish_close owns cancellation drainage. Only ordinary cleanup
|
|
32
|
+
failures are logged here so the caller can re-raise its acquisition error.
|
|
33
|
+
"""
|
|
34
|
+
try:
|
|
35
|
+
await owner.aclose()
|
|
36
|
+
except Exception:
|
|
37
|
+
logger.exception("Error rolling back invocation resources")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class ResourceScope:
|
|
41
|
+
"""Reverse-acquisition release stack; concurrent closes share one task."""
|
|
42
|
+
|
|
43
|
+
def __init__(self) -> None:
|
|
44
|
+
self._releases: list[Release] = []
|
|
45
|
+
self._retained: list[object] = []
|
|
46
|
+
self._releasing: set[asyncio.Task[None]] = set()
|
|
47
|
+
self._close_task: asyncio.Task[None] | None = None
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def closing(self) -> bool:
|
|
51
|
+
return self._close_task is not None
|
|
52
|
+
|
|
53
|
+
def own(self, release: Release) -> None:
|
|
54
|
+
"""Register the one release authority immediately after acquisition."""
|
|
55
|
+
if self.closing:
|
|
56
|
+
raise PreparedClosed("Resource owner is closing")
|
|
57
|
+
self._releases.append(release)
|
|
58
|
+
|
|
59
|
+
async def own_or_release(self, release: Release) -> None:
|
|
60
|
+
"""Register *release* for a resource acquired across an ``await``.
|
|
61
|
+
|
|
62
|
+
This owner may start closing during that ``await``. It then refuses the
|
|
63
|
+
registration, so *release* runs here, drained even when this caller is
|
|
64
|
+
cancelled, and :class:`PreparedClosed` still propagates.
|
|
65
|
+
"""
|
|
66
|
+
try:
|
|
67
|
+
self.own(release)
|
|
68
|
+
except PreparedClosed:
|
|
69
|
+
|
|
70
|
+
async def close_refused() -> None:
|
|
71
|
+
await release()
|
|
72
|
+
|
|
73
|
+
try:
|
|
74
|
+
await finish_close(asyncio.create_task(close_refused()))
|
|
75
|
+
except Exception:
|
|
76
|
+
logger.exception("Error releasing a resource its closing owner refused")
|
|
77
|
+
raise
|
|
78
|
+
|
|
79
|
+
def retain[T](self, resource: T) -> T:
|
|
80
|
+
"""Keep private in-memory state reachable until this scope drains."""
|
|
81
|
+
if self.closing:
|
|
82
|
+
raise PreparedClosed("Resource owner is closing")
|
|
83
|
+
self._retained.append(resource)
|
|
84
|
+
return resource
|
|
85
|
+
|
|
86
|
+
async def release(self, release: Release) -> None:
|
|
87
|
+
"""Release an operation-bound resource at its established shell boundary."""
|
|
88
|
+
self._releases.remove(release)
|
|
89
|
+
|
|
90
|
+
async def close_one() -> None:
|
|
91
|
+
await release()
|
|
92
|
+
|
|
93
|
+
task = asyncio.create_task(close_one())
|
|
94
|
+
self._releasing.add(task)
|
|
95
|
+
try:
|
|
96
|
+
await finish_close(task)
|
|
97
|
+
finally:
|
|
98
|
+
self._releasing.discard(task)
|
|
99
|
+
|
|
100
|
+
async def _close(self) -> None:
|
|
101
|
+
cancelled: asyncio.CancelledError | None = None
|
|
102
|
+
for task in tuple(self._releasing):
|
|
103
|
+
try:
|
|
104
|
+
await finish_close(task)
|
|
105
|
+
except asyncio.CancelledError as exc:
|
|
106
|
+
cancelled = exc
|
|
107
|
+
except Exception:
|
|
108
|
+
logger.exception("Error releasing invocation resource")
|
|
109
|
+
while self._releases:
|
|
110
|
+
release = self._releases.pop()
|
|
111
|
+
try:
|
|
112
|
+
await release()
|
|
113
|
+
except asyncio.CancelledError as exc:
|
|
114
|
+
cancelled = exc
|
|
115
|
+
except Exception:
|
|
116
|
+
logger.exception("Error releasing invocation resource")
|
|
117
|
+
self._retained.clear()
|
|
118
|
+
if cancelled is not None:
|
|
119
|
+
raise cancelled
|
|
120
|
+
|
|
121
|
+
async def aclose(self) -> None:
|
|
122
|
+
if self._close_task is None:
|
|
123
|
+
self._close_task = asyncio.create_task(self._close())
|
|
124
|
+
await finish_close(self._close_task)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class PassResources(ResourceScope):
|
|
128
|
+
"""A pass's mutable presentation and validation reset/cleanup lifetime.
|
|
129
|
+
|
|
130
|
+
This is only a resource scope, not an invocation handle or a backend run
|
|
131
|
+
contract. Validation instances belong to the conversation; their reset
|
|
132
|
+
hooks still execute inside the caller's existing pass try boundary.
|
|
133
|
+
"""
|
|
134
|
+
|
|
135
|
+
def __init__(self, handle: AttemptTaskHandle, start_hooks: tuple[Callable[[], None], ...]) -> None:
|
|
136
|
+
super().__init__()
|
|
137
|
+
self.handle = handle
|
|
138
|
+
self._start_hooks = start_hooks
|
|
139
|
+
|
|
140
|
+
def begin(self) -> None:
|
|
141
|
+
for hook in self._start_hooks:
|
|
142
|
+
hook()
|
|
143
|
+
|
|
144
|
+
def request_close(self, cause: AbortCause) -> None:
|
|
145
|
+
self.handle.cancel()
|
|
146
|
+
|
|
147
|
+
@property
|
|
148
|
+
def drained(self) -> Awaitable[None]:
|
|
149
|
+
return self._drain()
|
|
150
|
+
|
|
151
|
+
async def _drain(self) -> None:
|
|
152
|
+
task = self.handle.task
|
|
153
|
+
if task is not None:
|
|
154
|
+
await asyncio.gather(task, return_exceptions=True)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
class Conversation(ResourceScope):
|
|
158
|
+
"""Private runtime resources, plus the operation that currently uses them."""
|
|
159
|
+
|
|
160
|
+
def __init__(self, *, on_closed: Callable[[Conversation], None] | None = None) -> None:
|
|
161
|
+
super().__init__()
|
|
162
|
+
self._on_closed = on_closed
|
|
163
|
+
self._operation: OperationBinding | None = None
|
|
164
|
+
self._pass: OperationBinding | None = None
|
|
165
|
+
|
|
166
|
+
def bind_operation(self, binding: OperationBinding) -> Unbind:
|
|
167
|
+
if self.closing:
|
|
168
|
+
raise PreparedClosed("Conversation is closing")
|
|
169
|
+
if self._operation is not None:
|
|
170
|
+
raise RuntimeError("Conversation already has a bound operation")
|
|
171
|
+
self._operation = binding
|
|
172
|
+
|
|
173
|
+
def unbind() -> None:
|
|
174
|
+
if self._operation is binding:
|
|
175
|
+
self._operation = None
|
|
176
|
+
|
|
177
|
+
return unbind
|
|
178
|
+
|
|
179
|
+
def bind_pass(self, binding: OperationBinding) -> Unbind:
|
|
180
|
+
"""Retain pass convergence when there is no caller operation binding."""
|
|
181
|
+
if self.closing:
|
|
182
|
+
raise PreparedClosed("Conversation is closing")
|
|
183
|
+
if self._pass is not None:
|
|
184
|
+
raise RuntimeError("Conversation already has a bound pass")
|
|
185
|
+
self._pass = binding
|
|
186
|
+
|
|
187
|
+
def unbind() -> None:
|
|
188
|
+
if self._pass is binding:
|
|
189
|
+
self._pass = None
|
|
190
|
+
|
|
191
|
+
return unbind
|
|
192
|
+
|
|
193
|
+
async def _close(self) -> None:
|
|
194
|
+
binding = self._operation or self._pass
|
|
195
|
+
cancelled: asyncio.CancelledError | None = None
|
|
196
|
+
try:
|
|
197
|
+
if binding is not None:
|
|
198
|
+
binding.request_close(AbortCause.OWNER_CLOSE)
|
|
199
|
+
await binding.drained
|
|
200
|
+
except asyncio.CancelledError as exc:
|
|
201
|
+
cancelled = exc
|
|
202
|
+
except Exception:
|
|
203
|
+
logger.exception("Error draining invocation operation")
|
|
204
|
+
finally:
|
|
205
|
+
try:
|
|
206
|
+
await super()._close()
|
|
207
|
+
finally:
|
|
208
|
+
if self._on_closed is not None:
|
|
209
|
+
self._on_closed(self)
|
|
210
|
+
if cancelled is not None:
|
|
211
|
+
raise cancelled
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
class PreparedAgent(ResourceScope):
|
|
215
|
+
"""Shared resources, and the private conversations opened against them."""
|
|
216
|
+
|
|
217
|
+
def __init__(self) -> None:
|
|
218
|
+
super().__init__()
|
|
219
|
+
self._conversations: list[Conversation] = []
|
|
220
|
+
self._opening: list[tuple[asyncio.Task[Any], asyncio.Event]] = []
|
|
221
|
+
|
|
222
|
+
async def open[T](self, factory: Callable[[Conversation], Awaitable[T]]) -> T:
|
|
223
|
+
"""Acquire a private runtime, rolling back partial opens in reverse."""
|
|
224
|
+
if self.closing:
|
|
225
|
+
raise PreparedClosed("Prepared agent is closing")
|
|
226
|
+
conversation = Conversation(on_closed=self._forget_conversation)
|
|
227
|
+
task = asyncio.current_task()
|
|
228
|
+
if task is None:
|
|
229
|
+
raise RuntimeError("Opening a conversation requires an asyncio task.")
|
|
230
|
+
opening = (task, asyncio.Event())
|
|
231
|
+
self._opening.append(opening)
|
|
232
|
+
try:
|
|
233
|
+
value = await factory(conversation)
|
|
234
|
+
if self.closing:
|
|
235
|
+
raise PreparedClosed("Prepared agent closed during open")
|
|
236
|
+
self._conversations.append(conversation)
|
|
237
|
+
return value
|
|
238
|
+
except BaseException:
|
|
239
|
+
await rollback_resources(conversation)
|
|
240
|
+
raise
|
|
241
|
+
finally:
|
|
242
|
+
self._opening.remove(opening)
|
|
243
|
+
opening[1].set()
|
|
244
|
+
|
|
245
|
+
def _forget_conversation(self, conversation: Conversation) -> None:
|
|
246
|
+
if conversation in self._conversations:
|
|
247
|
+
self._conversations.remove(conversation)
|
|
248
|
+
|
|
249
|
+
async def _close(self) -> None:
|
|
250
|
+
opening = tuple(self._opening)
|
|
251
|
+
for task, _drained in opening:
|
|
252
|
+
task.cancel()
|
|
253
|
+
if opening:
|
|
254
|
+
# Await this acquire's rollback, not its caller task: the caller
|
|
255
|
+
# may itself join aclose() in its finally after open raises.
|
|
256
|
+
await asyncio.gather(*(drained.wait() for _task, drained in opening))
|
|
257
|
+
cancelled: asyncio.CancelledError | None = None
|
|
258
|
+
for conversation in reversed(tuple(self._conversations)):
|
|
259
|
+
try:
|
|
260
|
+
await conversation.aclose()
|
|
261
|
+
except asyncio.CancelledError as exc:
|
|
262
|
+
cancelled = exc
|
|
263
|
+
self._conversations.clear()
|
|
264
|
+
try:
|
|
265
|
+
await super()._close()
|
|
266
|
+
except asyncio.CancelledError as exc:
|
|
267
|
+
cancelled = exc
|
|
268
|
+
if cancelled is not None:
|
|
269
|
+
raise cancelled
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
class OperationLifetime:
|
|
273
|
+
"""Shell-owned completion barrier, including cleanup after the pass returns.
|
|
274
|
+
|
|
275
|
+
The common child shell owns this completion barrier from preparation through
|
|
276
|
+
its backend policy and terminal cleanup. Once cleanup
|
|
277
|
+
starts, owner-close latches but lets that cleanup finish in its original task.
|
|
278
|
+
"""
|
|
279
|
+
|
|
280
|
+
def __init__(self) -> None:
|
|
281
|
+
self._task = asyncio.current_task()
|
|
282
|
+
self._done = asyncio.Event()
|
|
283
|
+
self._cleaning = False
|
|
284
|
+
self._requested = False
|
|
285
|
+
self._close_task: asyncio.Task[None] | None = None
|
|
286
|
+
|
|
287
|
+
@property
|
|
288
|
+
def drained(self) -> Awaitable[None]:
|
|
289
|
+
return self._drain()
|
|
290
|
+
|
|
291
|
+
async def _drain(self) -> None:
|
|
292
|
+
await self._done.wait()
|
|
293
|
+
if self._close_task is not None:
|
|
294
|
+
await finish_close(self._close_task)
|
|
295
|
+
|
|
296
|
+
def cancel_preparation(self) -> None:
|
|
297
|
+
self._requested = True
|
|
298
|
+
self._cancel_operation()
|
|
299
|
+
|
|
300
|
+
def _cancel_operation(self) -> None:
|
|
301
|
+
if not self._cleaning and self._task is not None and not self._task.done():
|
|
302
|
+
self._task.cancel()
|
|
303
|
+
|
|
304
|
+
def close_with(self, close: Callable[[], Coroutine[Any, Any, None]]) -> None:
|
|
305
|
+
"""Run existing controller convergence, then wake a late pause callback."""
|
|
306
|
+
if self._requested:
|
|
307
|
+
return
|
|
308
|
+
self._requested = True
|
|
309
|
+
|
|
310
|
+
async def converge() -> None:
|
|
311
|
+
try:
|
|
312
|
+
await close()
|
|
313
|
+
finally:
|
|
314
|
+
self._cancel_operation()
|
|
315
|
+
|
|
316
|
+
self._close_task = asyncio.create_task(converge())
|
|
317
|
+
|
|
318
|
+
def begin_cleanup(self) -> None:
|
|
319
|
+
self._cleaning = True
|
|
320
|
+
|
|
321
|
+
def finish(self) -> None:
|
|
322
|
+
self._done.set()
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
class TurnTaskBinding:
|
|
326
|
+
"""A Turn shell's drain includes finalization and save on its owned task."""
|
|
327
|
+
|
|
328
|
+
def __init__(self, task: asyncio.Task[None], on_close: Callable[[AbortCause], None] | None) -> None:
|
|
329
|
+
self._task = task
|
|
330
|
+
self._on_close = on_close
|
|
331
|
+
|
|
332
|
+
def request_close(self, cause: AbortCause) -> None:
|
|
333
|
+
if self._on_close is not None:
|
|
334
|
+
self._on_close(cause)
|
|
335
|
+
if not self._task.done():
|
|
336
|
+
self._task.cancel()
|
|
337
|
+
|
|
338
|
+
@property
|
|
339
|
+
def drained(self) -> Awaitable[None]:
|
|
340
|
+
return self._drain()
|
|
341
|
+
|
|
342
|
+
async def _drain(self) -> None:
|
|
343
|
+
await asyncio.gather(self._task, return_exceptions=True)
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Per-conversation runtime factories and explicit main/child recipes.
|
|
4
|
+
|
|
5
|
+
Prepared shares the client, stateless tools, MCP adapter and skills index.
|
|
6
|
+
Context-management tools are generated by each private ContextManager, never
|
|
7
|
+
included in SharedRuntime. Recipes retain each shell's context and chat order;
|
|
8
|
+
callbacks here are bound to one conversation, not cached on the shared client.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
from typing import TYPE_CHECKING, Any, NotRequired, TypedDict
|
|
15
|
+
|
|
16
|
+
from chrys.kernel import Agent, AgentSession
|
|
17
|
+
from chrys.service.agent_middleware import ApprovalMiddleware, AskUserMiddleware
|
|
18
|
+
from chrys.service.agent_middleware.reminders.archive_pointer import CATALOG_POINTER_RECORD_COUNT_STATE_KEY
|
|
19
|
+
from chrys.service.agent_middleware.response_validation import ResponseValidationMiddleware
|
|
20
|
+
from chrys.service.agent_middleware.system_reminder import ReminderTurns, SystemReminderMiddleware
|
|
21
|
+
from chrys.service.context.compaction.last_words import LastWordsGenerator
|
|
22
|
+
from chrys.service.context.compaction.last_words_state import LastWordsState
|
|
23
|
+
from chrys.service.context.manager import ContextManager
|
|
24
|
+
from chrys.service.vision import image_stub_middleware_for_model
|
|
25
|
+
|
|
26
|
+
from .resources import Conversation
|
|
27
|
+
|
|
28
|
+
if TYPE_CHECKING:
|
|
29
|
+
from collections.abc import Awaitable, Callable, Mapping
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
|
|
32
|
+
from chrys.foundation.events.bus import EventBus
|
|
33
|
+
from chrys.foundation.models.session_env import SessionEnvironment
|
|
34
|
+
from chrys.foundation.retry import RetryAttemptInfo
|
|
35
|
+
from chrys.kernel.client import BaseChatClient
|
|
36
|
+
from chrys.kernel.middleware import ChatMiddleware
|
|
37
|
+
from chrys.service.agent_middleware.injection import InjectionMiddleware
|
|
38
|
+
from chrys.service.approval.judge import ApprovalJudge
|
|
39
|
+
from chrys.service.approval.policy import ApprovalMode, ApprovalPolicy
|
|
40
|
+
from chrys.service.approval.reuse_binding import ApprovalReuseBinding
|
|
41
|
+
from chrys.service.approval.turn_context import TurnContextHolder
|
|
42
|
+
from chrys.service.context.compaction import CompactionInfo, CompressInfo, PreCompactInfo
|
|
43
|
+
from chrys.service.context.compaction.last_words import CompactionStatus
|
|
44
|
+
from chrys.service.context.compaction.last_words_state import DropRoundBreakerState
|
|
45
|
+
from chrys.service.context.compaction.spill import SpillQuota
|
|
46
|
+
from chrys.service.hooks.manager import HookManager
|
|
47
|
+
from chrys.service.profiles.agents.schema import CompactionConfig
|
|
48
|
+
from chrys.service.profiles.models.schema import ModelProfile
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class ContextInputs(TypedDict):
|
|
52
|
+
"""Explicit inputs to the conversation-owned ContextManager."""
|
|
53
|
+
|
|
54
|
+
profile: ModelProfile
|
|
55
|
+
on_usage: NotRequired[Callable[..., Any] | None]
|
|
56
|
+
on_compaction: NotRequired[Callable[[CompactionInfo], Awaitable[None]] | None]
|
|
57
|
+
on_pre_compact: NotRequired[Callable[[PreCompactInfo], Awaitable[None]] | None]
|
|
58
|
+
on_compress: NotRequired[Callable[[CompressInfo], Awaitable[None]] | None]
|
|
59
|
+
on_context_pressure: NotRequired[Callable[[str, DropRoundBreakerState, int], Awaitable[None] | None] | None]
|
|
60
|
+
spill_quota: NotRequired[SpillQuota | None]
|
|
61
|
+
spill_record_dir: NotRequired[Path | None]
|
|
62
|
+
debug_log_dir: NotRequired[Path | None]
|
|
63
|
+
compaction_config: NotRequired[CompactionConfig | None]
|
|
64
|
+
include_context_management: NotRequired[bool]
|
|
65
|
+
memory_text: NotRequired[str]
|
|
66
|
+
warn_threshold_pct: NotRequired[float]
|
|
67
|
+
session_id: NotRequired[str | None]
|
|
68
|
+
parent_session_id: NotRequired[str | None]
|
|
69
|
+
session_dir: NotRequired[Path | None]
|
|
70
|
+
skip_local_history_for_service_context: NotRequired[bool]
|
|
71
|
+
service_context_default_options: NotRequired[Mapping[str, Any] | None]
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class ReminderInputs(TypedDict):
|
|
75
|
+
"""Explicit inputs to the conversation-owned SystemReminderMiddleware."""
|
|
76
|
+
|
|
77
|
+
runtime: NotRequired[SessionEnvironment | None]
|
|
78
|
+
max_context_tokens: NotRequired[int]
|
|
79
|
+
warn_threshold_pct: NotRequired[float]
|
|
80
|
+
sub_agent_names: NotRequired[list[str] | None]
|
|
81
|
+
shell_tool_enabled: NotRequired[bool]
|
|
82
|
+
tool_names: NotRequired[list[str] | None]
|
|
83
|
+
session_root: NotRequired[Path | None]
|
|
84
|
+
file_read_available: NotRequired[bool]
|
|
85
|
+
spill_quota: NotRequired[SpillQuota | None]
|
|
86
|
+
catalog_pointer_enabled: NotRequired[bool]
|
|
87
|
+
skill_catalog_provider: NotRequired[Callable[[], str | None] | None]
|
|
88
|
+
todo_state_provider: NotRequired[Callable[[], str | None] | None]
|
|
89
|
+
mcp_instructions_provider: NotRequired[Callable[[], str | None] | None]
|
|
90
|
+
file_change_provider: NotRequired[Callable[[], str | None] | None]
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class LastWordsInputs(TypedDict):
|
|
94
|
+
"""Explicit inputs to the conversation-owned LastWordsGenerator."""
|
|
95
|
+
|
|
96
|
+
profile: ModelProfile
|
|
97
|
+
template: NotRequired[str]
|
|
98
|
+
max_output_tokens: NotRequired[int]
|
|
99
|
+
log_dir: NotRequired[Path | None]
|
|
100
|
+
session_id: NotRequired[str | None]
|
|
101
|
+
parent_session_id: NotRequired[str | None]
|
|
102
|
+
session_dir: NotRequired[Path | None]
|
|
103
|
+
max_transient_retries: NotRequired[int | None]
|
|
104
|
+
publish_retry: NotRequired[Callable[[RetryAttemptInfo], Awaitable[None]] | None]
|
|
105
|
+
publish_status: NotRequired[Callable[[CompactionStatus], Awaitable[None]] | None]
|
|
106
|
+
report_usage: NotRequired[Callable[[Mapping[str, Any]], None] | None]
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class ApprovalInputs(TypedDict):
|
|
110
|
+
"""Explicit inputs to the conversation-owned ApprovalMiddleware."""
|
|
111
|
+
|
|
112
|
+
reuse: NotRequired[ApprovalReuseBinding | None]
|
|
113
|
+
approval_policy: ApprovalPolicy
|
|
114
|
+
event_bus: EventBus
|
|
115
|
+
session_id: NotRequired[str | None]
|
|
116
|
+
tool_kinds: NotRequired[dict[str, str] | None]
|
|
117
|
+
caller_name: NotRequired[str]
|
|
118
|
+
workspace_roots: NotRequired[list[str] | None]
|
|
119
|
+
approval_mode: NotRequired[ApprovalMode]
|
|
120
|
+
approval_judge: NotRequired[ApprovalJudge | None]
|
|
121
|
+
approval_log_dir: NotRequired[Path | None]
|
|
122
|
+
workspace_cwd: NotRequired[str | None]
|
|
123
|
+
dev_mode: NotRequired[bool]
|
|
124
|
+
hook_manager: NotRequired[HookManager | None]
|
|
125
|
+
profile_name: NotRequired[str]
|
|
126
|
+
session_archive_read_roots: NotRequired[list[Path] | None]
|
|
127
|
+
turn_context: NotRequired[TurnContextHolder | None]
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class AskUserInputs(TypedDict):
|
|
131
|
+
"""Explicit inputs to the conversation-owned AskUserMiddleware."""
|
|
132
|
+
|
|
133
|
+
event_bus: EventBus
|
|
134
|
+
session_id: NotRequired[str | None]
|
|
135
|
+
caller_name: NotRequired[str]
|
|
136
|
+
timeout_seconds: NotRequired[int | None]
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
@dataclass(frozen=True, slots=True)
|
|
140
|
+
class SharedRuntime:
|
|
141
|
+
"""Only Prepared-lifetime dependencies; no session-bound tool providers."""
|
|
142
|
+
|
|
143
|
+
client: BaseChatClient
|
|
144
|
+
tools: list[Any]
|
|
145
|
+
providers: list[Any]
|
|
146
|
+
name: str
|
|
147
|
+
instructions: str
|
|
148
|
+
vision: bool
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
@dataclass(frozen=True, slots=True)
|
|
152
|
+
class MainRecipe:
|
|
153
|
+
"""Root context/usage before injection, image, reminder, validation."""
|
|
154
|
+
|
|
155
|
+
context: ContextInputs
|
|
156
|
+
reminder: ReminderInputs
|
|
157
|
+
last_words: LastWordsInputs
|
|
158
|
+
injection: Callable[[], InjectionMiddleware]
|
|
159
|
+
validation: Callable[[Conversation], ResponseValidationMiddleware]
|
|
160
|
+
persist_recovery: Callable[[], Awaitable[bool]] | None
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
@dataclass(frozen=True, slots=True)
|
|
164
|
+
class ChildRecipe:
|
|
165
|
+
"""Private child context; image/reminder precede run usage/validation.
|
|
166
|
+
|
|
167
|
+
Registration's unused template keeps its historical usage middleware;
|
|
168
|
+
invocation wrappers never enter the shared client's context manager.
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
context: ContextInputs
|
|
172
|
+
reminder: ReminderInputs
|
|
173
|
+
last_words: LastWordsInputs
|
|
174
|
+
registration: bool
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
@dataclass(slots=True)
|
|
178
|
+
class KernelRuntime:
|
|
179
|
+
"""The state owned by one conversation; the Agent borrows shared transport."""
|
|
180
|
+
|
|
181
|
+
owner: Conversation
|
|
182
|
+
agent: Agent
|
|
183
|
+
context: ContextManager
|
|
184
|
+
reminder: SystemReminderMiddleware
|
|
185
|
+
last_words: LastWordsState
|
|
186
|
+
injection: InjectionMiddleware | None = None
|
|
187
|
+
validation: ResponseValidationMiddleware | None = None
|
|
188
|
+
|
|
189
|
+
def create_session(self) -> AgentSession:
|
|
190
|
+
return self.agent.create_session()
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def create_context(inputs: ContextInputs) -> ContextManager:
|
|
194
|
+
return ContextManager(**inputs)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def create_reminder(inputs: ReminderInputs) -> tuple[SystemReminderMiddleware, LastWordsState]:
|
|
198
|
+
"""Build the reminder middleware and the LAST_WORDS state it renders, on one shared turn holder."""
|
|
199
|
+
turns = ReminderTurns()
|
|
200
|
+
last_words = LastWordsState(
|
|
201
|
+
turns,
|
|
202
|
+
spill_quota=inputs.get("spill_quota"),
|
|
203
|
+
session_root=inputs.get("session_root"),
|
|
204
|
+
file_read_available=inputs.get("file_read_available", False),
|
|
205
|
+
todo_provider=inputs.get("todo_state_provider"),
|
|
206
|
+
)
|
|
207
|
+
return SystemReminderMiddleware(**inputs, last_words=last_words), last_words
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def restore_phase4_state(
|
|
211
|
+
reminder: SystemReminderMiddleware,
|
|
212
|
+
last_words: LastWordsState,
|
|
213
|
+
state: Mapping[str, Any] | None,
|
|
214
|
+
*,
|
|
215
|
+
available_relative_paths: frozenset[str] | set[str] | None = None,
|
|
216
|
+
) -> None:
|
|
217
|
+
"""Restore persisted Phase 4 state: the LAST_WORDS slot and the catalog pointer's record count."""
|
|
218
|
+
if not reminder.renders_last_words(last_words):
|
|
219
|
+
raise ValueError("restore_phase4_state needs the LAST_WORDS state this reminder middleware renders")
|
|
220
|
+
state = state or {}
|
|
221
|
+
last_words.restore(state, available_relative_paths=available_relative_paths)
|
|
222
|
+
reminder.sources.archive_pointer.restore_record_count(state.get(CATALOG_POINTER_RECORD_COUNT_STATE_KEY))
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def create_runtime(
|
|
226
|
+
owner: Conversation,
|
|
227
|
+
shared: SharedRuntime,
|
|
228
|
+
recipe: MainRecipe | ChildRecipe,
|
|
229
|
+
*,
|
|
230
|
+
context: ContextManager | None = None,
|
|
231
|
+
injection: InjectionMiddleware | None = None,
|
|
232
|
+
) -> KernelRuntime:
|
|
233
|
+
"""Assemble fresh mutable runtime, preserving both established chat chains.
|
|
234
|
+
|
|
235
|
+
Main build prepares context before tool/skill progress, then completes it
|
|
236
|
+
here. Child opens construct context here, after the invocation skill refresh.
|
|
237
|
+
When context is supplied, recipe.context is not used to create a context.
|
|
238
|
+
"""
|
|
239
|
+
ctx = create_context(recipe.context) if context is None else context
|
|
240
|
+
reminder, last_words = create_reminder(recipe.reminder)
|
|
241
|
+
ctx.compaction_strategy.bind_reminder(reminder, last_words)
|
|
242
|
+
if isinstance(recipe, MainRecipe) and recipe.persist_recovery is not None:
|
|
243
|
+
ctx.compaction_strategy.set_recovery_persistence_callback(recipe.persist_recovery)
|
|
244
|
+
generator = LastWordsGenerator(**recipe.last_words)
|
|
245
|
+
owner.own(generator.aclose)
|
|
246
|
+
ctx.compaction_strategy.set_last_words_generator(generator)
|
|
247
|
+
validation = recipe.validation(owner) if isinstance(recipe, MainRecipe) else None
|
|
248
|
+
if isinstance(recipe, MainRecipe):
|
|
249
|
+
injection = owner.retain(recipe.injection() if injection is None else injection)
|
|
250
|
+
injection.set_on_drained_reminders(reminder.queue_drained_injection_reminders)
|
|
251
|
+
chain: list[ChatMiddleware] = []
|
|
252
|
+
if isinstance(recipe, MainRecipe):
|
|
253
|
+
chain.extend(ctx.middleware)
|
|
254
|
+
if injection is None:
|
|
255
|
+
raise RuntimeError("The main agent recipe requires injection middleware.")
|
|
256
|
+
chain.append(injection)
|
|
257
|
+
elif recipe.registration:
|
|
258
|
+
chain.extend(ctx.middleware)
|
|
259
|
+
chain.append(image_stub_middleware_for_model(vision_enabled=shared.vision))
|
|
260
|
+
chain.append(reminder)
|
|
261
|
+
if isinstance(recipe, MainRecipe):
|
|
262
|
+
if validation is None:
|
|
263
|
+
raise RuntimeError("The main agent recipe requires response validation middleware.")
|
|
264
|
+
chain.append(validation)
|
|
265
|
+
agent = Agent(
|
|
266
|
+
client=shared.client,
|
|
267
|
+
name=shared.name,
|
|
268
|
+
instructions=shared.instructions,
|
|
269
|
+
tools=list(shared.tools),
|
|
270
|
+
context_providers=[*ctx.providers, *shared.providers],
|
|
271
|
+
middleware=chain,
|
|
272
|
+
)
|
|
273
|
+
return owner.retain(
|
|
274
|
+
KernelRuntime(
|
|
275
|
+
owner=owner,
|
|
276
|
+
agent=agent,
|
|
277
|
+
context=ctx,
|
|
278
|
+
reminder=reminder,
|
|
279
|
+
last_words=last_words,
|
|
280
|
+
injection=injection,
|
|
281
|
+
validation=validation,
|
|
282
|
+
)
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
async def create_approval(owner: Conversation, inputs: ApprovalInputs) -> ApprovalMiddleware:
|
|
287
|
+
approval = ApprovalMiddleware(**inputs)
|
|
288
|
+
await owner.own_or_release(approval.close)
|
|
289
|
+
return approval
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def create_ask_user(owner: Conversation, inputs: AskUserInputs) -> AskUserMiddleware:
|
|
293
|
+
return owner.retain(AskUserMiddleware(**inputs))
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
def create_validation(
|
|
297
|
+
owner: Conversation, *, publish_retry: Callable[[RetryAttemptInfo], Awaitable[None]] | None
|
|
298
|
+
) -> ResponseValidationMiddleware:
|
|
299
|
+
return owner.retain(ResponseValidationMiddleware(publish_retry=publish_retry))
|