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,616 @@
|
|
|
1
|
+
# Copyright (c) Microsoft. All rights reserved.
|
|
2
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
3
|
+
# Contains code adapted from Microsoft Agent Framework (MIT License; see NOTICE).
|
|
4
|
+
|
|
5
|
+
"""Chat and function middleware contexts, pipelines and client composition.
|
|
6
|
+
|
|
7
|
+
``Agent`` routes constructor and run middleware through ``split_middleware``.
|
|
8
|
+
``ToolLoopLayer`` executes function middleware, while ``ChatMiddlewareLayer``
|
|
9
|
+
wraps each model call. Middleware must subclass the corresponding ABC;
|
|
10
|
+
plain callables are rejected.
|
|
11
|
+
|
|
12
|
+
Chat termination returns the context's result. Function termination reaches
|
|
13
|
+
the tool loop so it can stop execution and consume the exception's result.
|
|
14
|
+
|
|
15
|
+
Service middleware imports this module; kernel dependencies stay within this
|
|
16
|
+
package, allowed third-party packages and foundation to avoid reverse cycles.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import contextlib
|
|
22
|
+
import inspect
|
|
23
|
+
from abc import ABC, abstractmethod
|
|
24
|
+
from collections.abc import Sequence
|
|
25
|
+
from typing import TYPE_CHECKING, Any, NamedTuple, Protocol, TypeIs, cast
|
|
26
|
+
|
|
27
|
+
from ._types import ResponseStream
|
|
28
|
+
from .client import SupportsAclose, _PreparedRequestObserverClient
|
|
29
|
+
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
from collections.abc import Awaitable, Callable, Mapping
|
|
32
|
+
|
|
33
|
+
from pydantic import BaseModel
|
|
34
|
+
|
|
35
|
+
from ._types import ChatResponse, ChatResponseUpdate, Message, ToolTypes
|
|
36
|
+
from .sessions import AgentSession
|
|
37
|
+
from .tools import FunctionTool
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _is_chat_response_stream(
|
|
41
|
+
value: object,
|
|
42
|
+
) -> TypeIs[ResponseStream[ChatResponseUpdate, ChatResponse]]:
|
|
43
|
+
"""Narrow a stream held in the chat-context result union."""
|
|
44
|
+
return isinstance(value, ResponseStream)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class MiddlewareTermination(Exception):
|
|
48
|
+
"""Control-flow exception that terminates middleware execution early.
|
|
49
|
+
|
|
50
|
+
``result`` is consumed by whichever layer catches the termination: the chat
|
|
51
|
+
pipeline suppresses the exception and returns ``context.result``; the
|
|
52
|
+
function pipeline lets it propagate so the tool loop can stop and read
|
|
53
|
+
``exc.result``.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
result: Any
|
|
57
|
+
|
|
58
|
+
def __init__(self, message: str = "Middleware terminated execution.", *, result: Any = None) -> None:
|
|
59
|
+
super().__init__(message)
|
|
60
|
+
self.result = result
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class FunctionInvocationContext:
|
|
64
|
+
"""Context for one tool invocation through the function middleware pipeline.
|
|
65
|
+
|
|
66
|
+
``metadata`` and ``kwargs`` are fresh dict copies; ``tools`` stores the live list it
|
|
67
|
+
is given (aliased on purpose — mutations through :meth:`add_tools` and
|
|
68
|
+
:meth:`remove_tools` are how progressive tool exposure works in the loop).
|
|
69
|
+
|
|
70
|
+
Chrys middleware consumes: ``function.name``, the out-of-band chrys kind
|
|
71
|
+
(``function.chrys_kind`` via ``chrys.foundation.tool_kinds.get_tool_kind``),
|
|
72
|
+
``arguments``, ``metadata``, ``result``.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
def __init__(
|
|
76
|
+
self,
|
|
77
|
+
function: FunctionTool,
|
|
78
|
+
arguments: BaseModel | Mapping[str, Any],
|
|
79
|
+
session: AgentSession | None = None,
|
|
80
|
+
metadata: Mapping[str, Any] | None = None,
|
|
81
|
+
result: Any = None,
|
|
82
|
+
kwargs: Mapping[str, Any] | None = None,
|
|
83
|
+
tools: list[ToolTypes] | None = None,
|
|
84
|
+
) -> None:
|
|
85
|
+
self.function = function
|
|
86
|
+
self.arguments = arguments
|
|
87
|
+
self.session = session
|
|
88
|
+
self.metadata: dict[str, Any] = dict(metadata) if metadata is not None else {}
|
|
89
|
+
self.result = result
|
|
90
|
+
self.kwargs: dict[str, Any] = dict(kwargs) if kwargs is not None else {}
|
|
91
|
+
self.tools = tools
|
|
92
|
+
# Count calls in the current gather-batch targeting this tool. The loop stamps
|
|
93
|
+
# the real per-name count before execution; the default keeps direct /
|
|
94
|
+
# test invocations behaving as singletons. Middleware enforcing
|
|
95
|
+
# singleton semantics (whole-list replacement tools) rejects when > 1.
|
|
96
|
+
self.same_tool_calls_in_batch: int = 1
|
|
97
|
+
|
|
98
|
+
def add_tools(
|
|
99
|
+
self,
|
|
100
|
+
tools: ToolTypes | Callable[..., Any] | Sequence[ToolTypes | Callable[..., Any]],
|
|
101
|
+
) -> None:
|
|
102
|
+
"""Add tools to the current run for the next model iteration.
|
|
103
|
+
|
|
104
|
+
The complete input batch is normalized and duplicate-checked against a
|
|
105
|
+
copy before the aliased live list is mutated. Re-adding the same object
|
|
106
|
+
is a no-op; a different object with the same name raises ``ValueError``.
|
|
107
|
+
|
|
108
|
+
Raises:
|
|
109
|
+
RuntimeError: If this invocation is not bound to a live tool loop.
|
|
110
|
+
ValueError: If the batch introduces a conflicting duplicate name.
|
|
111
|
+
"""
|
|
112
|
+
from .tools import _append_unique_tools, normalize_tools
|
|
113
|
+
|
|
114
|
+
if self.tools is None:
|
|
115
|
+
raise RuntimeError(
|
|
116
|
+
"Cannot add tools: this FunctionInvocationContext is not bound to a live "
|
|
117
|
+
"agent run. add_tools is only available for functions invoked within an "
|
|
118
|
+
"agent's function-calling loop."
|
|
119
|
+
)
|
|
120
|
+
merged = _append_unique_tools(list(self.tools), normalize_tools(tools))
|
|
121
|
+
self.tools[:] = merged
|
|
122
|
+
|
|
123
|
+
def remove_tools(
|
|
124
|
+
self,
|
|
125
|
+
tools: ToolTypes | Callable[..., Any] | Sequence[ToolTypes | Callable[..., Any]] | str | Sequence[str],
|
|
126
|
+
) -> None:
|
|
127
|
+
"""Remove tools from the current run for the next model iteration.
|
|
128
|
+
|
|
129
|
+
String inputs remove every tool with that name. Tool objects and
|
|
130
|
+
original callables remove their exact normalized live instances, so an
|
|
131
|
+
unrelated tool that shares a name is preserved. Missing and nameless
|
|
132
|
+
tools are ignored.
|
|
133
|
+
|
|
134
|
+
Raises:
|
|
135
|
+
RuntimeError: If this invocation is not bound to a live tool loop.
|
|
136
|
+
"""
|
|
137
|
+
from .tools import FunctionTool, declared_tool_name, normalize_tools
|
|
138
|
+
|
|
139
|
+
if self.tools is None:
|
|
140
|
+
raise RuntimeError(
|
|
141
|
+
"Cannot remove tools: this FunctionInvocationContext is not bound to a live "
|
|
142
|
+
"agent run. remove_tools is only available for functions invoked within an "
|
|
143
|
+
"agent's function-calling loop."
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
raw_items: list[Any]
|
|
147
|
+
if isinstance(tools, str):
|
|
148
|
+
raw_items = [tools]
|
|
149
|
+
elif isinstance(tools, Sequence) and not isinstance(tools, (bytes, bytearray)):
|
|
150
|
+
raw_items = list(tools)
|
|
151
|
+
else:
|
|
152
|
+
raw_items = [tools]
|
|
153
|
+
|
|
154
|
+
names_to_remove: set[str] = set()
|
|
155
|
+
instances_to_remove: set[int] = set()
|
|
156
|
+
callables_to_remove: set[int] = set()
|
|
157
|
+
for tool_item in raw_items:
|
|
158
|
+
if isinstance(tool_item, str):
|
|
159
|
+
names_to_remove.add(tool_item)
|
|
160
|
+
continue
|
|
161
|
+
if isinstance(tool_item, FunctionTool):
|
|
162
|
+
instances_to_remove.add(id(tool_item))
|
|
163
|
+
continue
|
|
164
|
+
if callable(tool_item):
|
|
165
|
+
callables_to_remove.add(id(tool_item))
|
|
166
|
+
continue
|
|
167
|
+
for normalized_tool in normalize_tools(tool_item):
|
|
168
|
+
instances_to_remove.add(id(normalized_tool))
|
|
169
|
+
|
|
170
|
+
if names_to_remove or instances_to_remove or callables_to_remove:
|
|
171
|
+
self.tools[:] = [
|
|
172
|
+
tool_item
|
|
173
|
+
for tool_item in self.tools
|
|
174
|
+
if id(tool_item) not in instances_to_remove
|
|
175
|
+
and declared_tool_name(tool_item) not in names_to_remove
|
|
176
|
+
and not (
|
|
177
|
+
isinstance(tool_item, FunctionTool)
|
|
178
|
+
and tool_item.func is not None
|
|
179
|
+
and id(tool_item.func) in callables_to_remove
|
|
180
|
+
)
|
|
181
|
+
]
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class ChatContext:
|
|
185
|
+
"""Context for one model call through the chat middleware pipeline.
|
|
186
|
+
|
|
187
|
+
``messages`` copy contract — "调用前可变换的副本" (a mutable-before-call
|
|
188
|
+
copy): ``ChatMiddlewareLayer`` builds this context with
|
|
189
|
+
``messages=list(messages)`` — a fresh list per call that shares the
|
|
190
|
+
caller's Message objects. Middleware may replace elements in place or
|
|
191
|
+
rebind the attribute to a new list; the post-pipeline value of
|
|
192
|
+
``context.messages`` is what reaches the inner client, and mutations never
|
|
193
|
+
leak into the caller's list or into later calls. The copy is the *layer's*
|
|
194
|
+
contract — this constructor stores exactly what it is given.
|
|
195
|
+
"""
|
|
196
|
+
|
|
197
|
+
def __init__(
|
|
198
|
+
self,
|
|
199
|
+
client: Any,
|
|
200
|
+
messages: Sequence[Message],
|
|
201
|
+
options: Mapping[str, Any] | None,
|
|
202
|
+
stream: bool = False,
|
|
203
|
+
metadata: Mapping[str, Any] | None = None,
|
|
204
|
+
result: ChatResponse | ResponseStream[ChatResponseUpdate, ChatResponse] | None = None,
|
|
205
|
+
kwargs: Mapping[str, Any] | None = None,
|
|
206
|
+
function_invocation_kwargs: Mapping[str, Any] | None = None,
|
|
207
|
+
stream_transform_hooks: Sequence[
|
|
208
|
+
Callable[[ChatResponseUpdate], ChatResponseUpdate | Awaitable[ChatResponseUpdate]]
|
|
209
|
+
]
|
|
210
|
+
| None = None,
|
|
211
|
+
stream_result_hooks: Sequence[Callable[[ChatResponse], ChatResponse | Awaitable[ChatResponse]]] | None = None,
|
|
212
|
+
stream_cleanup_hooks: Sequence[Callable[[], Awaitable[None] | None]] | None = None,
|
|
213
|
+
stream_update_filters: Sequence[Callable[[ChatResponseUpdate], ChatResponseUpdate]] | None = None,
|
|
214
|
+
request_message_observers: Sequence[Callable[[Sequence[Message]], None]] | None = None,
|
|
215
|
+
) -> None:
|
|
216
|
+
self.client = client
|
|
217
|
+
self.messages = messages
|
|
218
|
+
self.options = options
|
|
219
|
+
self.stream = stream
|
|
220
|
+
self.metadata: dict[str, Any] = dict(metadata) if metadata is not None else {}
|
|
221
|
+
self.result = result
|
|
222
|
+
self.kwargs: dict[str, Any] = dict(kwargs) if kwargs is not None else {}
|
|
223
|
+
self.function_invocation_kwargs: dict[str, Any] = (
|
|
224
|
+
dict(function_invocation_kwargs) if function_invocation_kwargs is not None else {}
|
|
225
|
+
)
|
|
226
|
+
self.stream_transform_hooks = list(stream_transform_hooks or [])
|
|
227
|
+
self.stream_result_hooks = list(stream_result_hooks or [])
|
|
228
|
+
self.stream_cleanup_hooks = list(stream_cleanup_hooks or [])
|
|
229
|
+
# Unlike the stream_* hooks above (attached to the FINAL result stream
|
|
230
|
+
# after the chain), update filters attach to the stream the final
|
|
231
|
+
# handler resolves — beneath every middleware — so a middleware that
|
|
232
|
+
# drains the inner stream and re-streams it through a proxy (response
|
|
233
|
+
# validation) still consumes filtered updates, and a retry's fresh
|
|
234
|
+
# inner stream is filtered again automatically. Middleware may append
|
|
235
|
+
# here before calling ``call_next()``.
|
|
236
|
+
self.stream_update_filters = list(stream_update_filters or [])
|
|
237
|
+
# Request observers run at the final-handler boundary after every
|
|
238
|
+
# middleware has transformed ``messages`` and immediately before the
|
|
239
|
+
# inner client sees them. They are chrys-owned request-path plumbing,
|
|
240
|
+
# not middleware hooks, and therefore are not forwarded on the wire.
|
|
241
|
+
self.request_message_observers = list(request_message_observers or [])
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
class ChatMiddleware(ABC):
|
|
245
|
+
"""Intercepts one model call.
|
|
246
|
+
|
|
247
|
+
Contract (all data flows through the context; ``call_next`` takes no
|
|
248
|
+
arguments and returns nothing):
|
|
249
|
+
|
|
250
|
+
- ``await call_next()`` runs the rest of the chain plus the inner client
|
|
251
|
+
and populates ``context.result``; post-processing after it sees the
|
|
252
|
+
actual result.
|
|
253
|
+
- Setting ``context.result`` and *not* calling ``call_next()`` overrides
|
|
254
|
+
execution (the inner client is never reached).
|
|
255
|
+
- Raising :class:`MiddlewareTermination` stops the chain; the chat
|
|
256
|
+
pipeline suppresses it and returns whatever ``context.result`` holds.
|
|
257
|
+
"""
|
|
258
|
+
|
|
259
|
+
@abstractmethod
|
|
260
|
+
async def process(self, context: ChatContext, call_next: Callable[[], Awaitable[None]]) -> None:
|
|
261
|
+
"""Process one chat request; mutate ``context`` rather than returning."""
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
class FunctionMiddleware(ABC):
|
|
265
|
+
"""Intercepts one tool invocation.
|
|
266
|
+
|
|
267
|
+
Same contract shape as :class:`ChatMiddleware`, with one difference:
|
|
268
|
+
:class:`MiddlewareTermination` raised here *propagates* out of the function
|
|
269
|
+
pipeline so the tool loop can terminate and read ``exc.result``.
|
|
270
|
+
"""
|
|
271
|
+
|
|
272
|
+
@abstractmethod
|
|
273
|
+
async def process(self, context: FunctionInvocationContext, call_next: Callable[[], Awaitable[None]]) -> None:
|
|
274
|
+
"""Process one tool invocation; mutate ``context`` rather than returning."""
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
class _EmptyAsyncIterator:
|
|
278
|
+
"""Async iterator yielding nothing after middleware terminates without a result."""
|
|
279
|
+
|
|
280
|
+
def __aiter__(self) -> _EmptyAsyncIterator:
|
|
281
|
+
return self
|
|
282
|
+
|
|
283
|
+
async def __anext__(self) -> Any:
|
|
284
|
+
raise StopAsyncIteration
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
class ChatMiddlewarePipeline:
|
|
288
|
+
"""Executes chat middleware as a nested chain; first in list = outermost.
|
|
289
|
+
|
|
290
|
+
Only :class:`ChatMiddleware` instances are accepted; plain callables
|
|
291
|
+
raise ``TypeError``.
|
|
292
|
+
"""
|
|
293
|
+
|
|
294
|
+
def __init__(self, *middleware: ChatMiddleware) -> None:
|
|
295
|
+
for item in middleware:
|
|
296
|
+
if not isinstance(item, ChatMiddleware):
|
|
297
|
+
raise TypeError(
|
|
298
|
+
f"chat middleware must subclass chrys ChatMiddleware (plain callables are not supported), got {item!r}"
|
|
299
|
+
)
|
|
300
|
+
self._middleware: list[ChatMiddleware] = list(middleware)
|
|
301
|
+
|
|
302
|
+
@property
|
|
303
|
+
def has_middlewares(self) -> bool:
|
|
304
|
+
return bool(self._middleware)
|
|
305
|
+
|
|
306
|
+
async def execute(
|
|
307
|
+
self,
|
|
308
|
+
context: ChatContext,
|
|
309
|
+
final_handler: Callable[
|
|
310
|
+
[ChatContext], Awaitable[ChatResponse] | ResponseStream[ChatResponseUpdate, ChatResponse]
|
|
311
|
+
],
|
|
312
|
+
) -> ChatResponse | ResponseStream[ChatResponseUpdate, ChatResponse] | None:
|
|
313
|
+
def observe_request_messages() -> None:
|
|
314
|
+
# Run immediately before every final-handler invocation. A
|
|
315
|
+
# middleware may call ``call_next`` repeatedly (for example a
|
|
316
|
+
# validation retry), and each resulting wire request must be
|
|
317
|
+
# observed independently.
|
|
318
|
+
for observer in context.request_message_observers:
|
|
319
|
+
observer(context.messages)
|
|
320
|
+
|
|
321
|
+
def attach_update_filters() -> None:
|
|
322
|
+
# At the final-handler boundary — beneath every middleware — so
|
|
323
|
+
# semantic stream proxies (a middleware draining the inner stream
|
|
324
|
+
# and replaying it through its own generator) consume filtered
|
|
325
|
+
# updates, and every retry's fresh inner stream is covered.
|
|
326
|
+
result = context.result
|
|
327
|
+
if context.stream and context.stream_update_filters and _is_chat_response_stream(result):
|
|
328
|
+
for update_filter in context.stream_update_filters:
|
|
329
|
+
result.with_update_filter(update_filter)
|
|
330
|
+
|
|
331
|
+
if not self._middleware:
|
|
332
|
+
# Resolve, store, then validate the stream shape on the fast path.
|
|
333
|
+
observe_request_messages()
|
|
334
|
+
raw = final_handler(context)
|
|
335
|
+
resolved = (await raw) if inspect.isawaitable(raw) else raw
|
|
336
|
+
context.result = resolved
|
|
337
|
+
if context.stream and not isinstance(resolved, ResponseStream):
|
|
338
|
+
raise ValueError("Streaming agent middleware requires a ResponseStream result.")
|
|
339
|
+
attach_update_filters()
|
|
340
|
+
return resolved
|
|
341
|
+
|
|
342
|
+
def create_next_handler(index: int) -> Callable[[], Awaitable[None]]:
|
|
343
|
+
if index >= len(self._middleware):
|
|
344
|
+
|
|
345
|
+
async def final_wrapper() -> None:
|
|
346
|
+
observe_request_messages()
|
|
347
|
+
raw = final_handler(context)
|
|
348
|
+
context.result = (await raw) if inspect.isawaitable(raw) else raw
|
|
349
|
+
attach_update_filters()
|
|
350
|
+
|
|
351
|
+
return final_wrapper
|
|
352
|
+
|
|
353
|
+
async def current_handler() -> None:
|
|
354
|
+
await self._middleware[index].process(context, create_next_handler(index + 1))
|
|
355
|
+
|
|
356
|
+
return current_handler
|
|
357
|
+
|
|
358
|
+
# Chat termination is suppressed here: the chain stops
|
|
359
|
+
# and whatever context.result holds is the outcome.
|
|
360
|
+
with contextlib.suppress(MiddlewareTermination):
|
|
361
|
+
await create_next_handler(0)()
|
|
362
|
+
|
|
363
|
+
# Attach final-stream hooks only to a truthy result; keep the truthiness check.
|
|
364
|
+
result = context.result
|
|
365
|
+
if result and _is_chat_response_stream(result):
|
|
366
|
+
for transform_hook in context.stream_transform_hooks:
|
|
367
|
+
result.with_transform_hook(transform_hook)
|
|
368
|
+
for result_hook in context.stream_result_hooks:
|
|
369
|
+
result.with_result_hook(result_hook)
|
|
370
|
+
for cleanup_hook in context.stream_cleanup_hooks:
|
|
371
|
+
result.with_cleanup_hook(cleanup_hook)
|
|
372
|
+
return context.result
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
class FunctionMiddlewarePipeline:
|
|
376
|
+
"""Executes function middleware as a nested chain; first in list = outermost.
|
|
377
|
+
|
|
378
|
+
:class:`MiddlewareTermination` propagates to the
|
|
379
|
+
caller (the tool loop) to signal loop termination.
|
|
380
|
+
"""
|
|
381
|
+
|
|
382
|
+
def __init__(self, *middleware: FunctionMiddleware) -> None:
|
|
383
|
+
for item in middleware:
|
|
384
|
+
if not isinstance(item, FunctionMiddleware):
|
|
385
|
+
raise TypeError(
|
|
386
|
+
f"function middleware must subclass chrys FunctionMiddleware (plain callables are not supported), got {item!r}"
|
|
387
|
+
)
|
|
388
|
+
self._middleware: list[FunctionMiddleware] = list(middleware)
|
|
389
|
+
|
|
390
|
+
@property
|
|
391
|
+
def has_middlewares(self) -> bool:
|
|
392
|
+
return bool(self._middleware)
|
|
393
|
+
|
|
394
|
+
async def execute(
|
|
395
|
+
self,
|
|
396
|
+
context: FunctionInvocationContext,
|
|
397
|
+
final_handler: Callable[[FunctionInvocationContext], Awaitable[Any]],
|
|
398
|
+
) -> Any:
|
|
399
|
+
if not self._middleware:
|
|
400
|
+
# With no middleware to observe context.result, the fast path
|
|
401
|
+
# deliberately returns the raw result without populating that field.
|
|
402
|
+
return await final_handler(context)
|
|
403
|
+
|
|
404
|
+
def create_next_handler(index: int) -> Callable[[], Awaitable[None]]:
|
|
405
|
+
if index >= len(self._middleware):
|
|
406
|
+
|
|
407
|
+
async def final_wrapper() -> None:
|
|
408
|
+
context.result = final_handler(context)
|
|
409
|
+
if inspect.isawaitable(context.result):
|
|
410
|
+
context.result = await context.result
|
|
411
|
+
|
|
412
|
+
return final_wrapper
|
|
413
|
+
|
|
414
|
+
async def current_handler() -> None:
|
|
415
|
+
await self._middleware[index].process(context, create_next_handler(index + 1))
|
|
416
|
+
|
|
417
|
+
return current_handler
|
|
418
|
+
|
|
419
|
+
# Function termination propagates so the tool loop can stop.
|
|
420
|
+
await create_next_handler(0)()
|
|
421
|
+
return context.result
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
class MiddlewareSplit(NamedTuple):
|
|
425
|
+
"""Result of :func:`split_middleware`."""
|
|
426
|
+
|
|
427
|
+
chat: list[ChatMiddleware]
|
|
428
|
+
function: list[FunctionMiddleware]
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
def _as_middleware_list(
|
|
432
|
+
source: ChatMiddleware | FunctionMiddleware | Sequence[ChatMiddleware | FunctionMiddleware] | None,
|
|
433
|
+
) -> list[ChatMiddleware | FunctionMiddleware]:
|
|
434
|
+
"""Normalize one source, treating only ``None`` as empty."""
|
|
435
|
+
if source is None:
|
|
436
|
+
return []
|
|
437
|
+
if isinstance(source, Sequence) and not isinstance(source, (str, bytes)):
|
|
438
|
+
return list(cast("Sequence[ChatMiddleware | FunctionMiddleware]", source))
|
|
439
|
+
return [cast("ChatMiddleware | FunctionMiddleware", source)]
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
def split_middleware(
|
|
443
|
+
*sources: ChatMiddleware | FunctionMiddleware | Sequence[ChatMiddleware | FunctionMiddleware] | None,
|
|
444
|
+
) -> MiddlewareSplit:
|
|
445
|
+
"""Flatten middleware sources into ordered chat and function lists.
|
|
446
|
+
|
|
447
|
+
Sources may be ``None`` (skipped), single instances or sequences.
|
|
448
|
+
Unsupported instances raise ``TypeError``. Relative order is preserved
|
|
449
|
+
within each bucket; an instance implementing both ABCs goes into the
|
|
450
|
+
function bucket because ``FunctionMiddleware`` is checked first.
|
|
451
|
+
"""
|
|
452
|
+
chat: list[ChatMiddleware] = []
|
|
453
|
+
function: list[FunctionMiddleware] = []
|
|
454
|
+
flattened: list[Any] = []
|
|
455
|
+
for source in sources:
|
|
456
|
+
flattened.extend(_as_middleware_list(source))
|
|
457
|
+
for item in flattened:
|
|
458
|
+
if isinstance(item, FunctionMiddleware):
|
|
459
|
+
function.append(item)
|
|
460
|
+
elif isinstance(item, ChatMiddleware):
|
|
461
|
+
chat.append(item)
|
|
462
|
+
else:
|
|
463
|
+
raise TypeError(
|
|
464
|
+
f"middleware must be a chrys ChatMiddleware or FunctionMiddleware instance (plain callables are not supported), got {item!r}"
|
|
465
|
+
)
|
|
466
|
+
return MiddlewareSplit(chat=chat, function=function)
|
|
467
|
+
|
|
468
|
+
|
|
469
|
+
class SupportsGetResponse(Protocol):
|
|
470
|
+
"""Minimal inner-client contract :class:`ChatMiddlewareLayer` wraps.
|
|
471
|
+
|
|
472
|
+
- ``stream=False``: returns an awaitable resolving to a ``ChatResponse``.
|
|
473
|
+
- ``stream=True``: MUST return a ``ResponseStream`` synchronously, not a
|
|
474
|
+
coroutine — the layer never awaits at call time.
|
|
475
|
+
- Extra keyword arguments must be accepted and forwarded as appropriate.
|
|
476
|
+
"""
|
|
477
|
+
|
|
478
|
+
def get_response(
|
|
479
|
+
self,
|
|
480
|
+
messages: Sequence[Message],
|
|
481
|
+
*,
|
|
482
|
+
stream: bool = ...,
|
|
483
|
+
options: Mapping[str, Any] | None = ...,
|
|
484
|
+
function_invocation_kwargs: Mapping[str, Any] | None = ...,
|
|
485
|
+
**kwargs: Any,
|
|
486
|
+
) -> Awaitable[ChatResponse] | ResponseStream[ChatResponseUpdate, ChatResponse]: ...
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
class SupportsChatInner(SupportsGetResponse, SupportsAclose, Protocol):
|
|
490
|
+
"""What :class:`ChatMiddlewareLayer` wraps: a model call plus the stack's close."""
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
class ChatMiddlewareLayer:
|
|
494
|
+
"""Composition-style chat middleware layer over an inner client.
|
|
495
|
+
|
|
496
|
+
Per-call ``middleware=`` is consumed here and never enters
|
|
497
|
+
``context.kwargs``. Compaction and tokenization belong to the loop and
|
|
498
|
+
agent layers; other extras flow through ``context.kwargs`` to the client.
|
|
499
|
+
|
|
500
|
+
``context.messages`` copy contract: when middleware is present, the context
|
|
501
|
+
gets a fresh ``list(messages)`` per call sharing the caller's Message
|
|
502
|
+
objects, and ``_middleware_handler`` re-reads ``context.messages`` after
|
|
503
|
+
the pipeline ran — element swaps and whole-list rebinds reach the wire and
|
|
504
|
+
never leak across calls. The no-middleware fast path forwards the caller's
|
|
505
|
+
sequence without copying.
|
|
506
|
+
"""
|
|
507
|
+
|
|
508
|
+
def __init__(self, inner: SupportsChatInner, *, middleware: Sequence[ChatMiddleware] | None = None) -> None:
|
|
509
|
+
self.inner = inner
|
|
510
|
+
self.chat_middleware: list[ChatMiddleware] = list(middleware) if middleware else []
|
|
511
|
+
|
|
512
|
+
def __getattr__(self, name: str) -> Any:
|
|
513
|
+
# Delegate unknown attributes to the inner client so agent-facing client
|
|
514
|
+
# surface (model, STORES_BY_DEFAULT, ...) resolves through the stack.
|
|
515
|
+
if name == "inner":
|
|
516
|
+
raise AttributeError(name)
|
|
517
|
+
return getattr(self.inner, name)
|
|
518
|
+
|
|
519
|
+
async def aclose(self) -> None:
|
|
520
|
+
await self.inner.aclose()
|
|
521
|
+
|
|
522
|
+
def get_response(
|
|
523
|
+
self,
|
|
524
|
+
messages: Sequence[Message],
|
|
525
|
+
*,
|
|
526
|
+
stream: bool = False,
|
|
527
|
+
options: Mapping[str, Any] | None = None,
|
|
528
|
+
middleware: Sequence[ChatMiddleware] | None = None,
|
|
529
|
+
function_invocation_kwargs: Mapping[str, Any] | None = None,
|
|
530
|
+
stream_update_filter: Callable[[ChatResponseUpdate], ChatResponseUpdate] | None = None,
|
|
531
|
+
request_message_observer: Callable[[Sequence[Message]], None] | None = None,
|
|
532
|
+
**kwargs: Any,
|
|
533
|
+
) -> Awaitable[ChatResponse | None] | ResponseStream[ChatResponseUpdate, ChatResponse]:
|
|
534
|
+
# Constructor middleware runs outermost. Stateless pipelines are rebuilt
|
|
535
|
+
# per call so changes to either middleware list take effect.
|
|
536
|
+
#
|
|
537
|
+
# ``stream_update_filter`` and ``request_message_observer`` are chrys
|
|
538
|
+
# extensions consumed here (like ``middleware=``, neither lands in
|
|
539
|
+
# ``context.kwargs``). The filter reaches the stream the FINAL handler
|
|
540
|
+
# resolves, beneath every middleware — the only delivery path that
|
|
541
|
+
# crosses semantic stream proxies (a middleware draining the inner
|
|
542
|
+
# stream and replaying it), which ``ResponseStream.with_update_filter``
|
|
543
|
+
# push-down cannot. The observer sees the corresponding post-middleware
|
|
544
|
+
# request immediately before the final handler runs.
|
|
545
|
+
pipeline = ChatMiddlewarePipeline(*self.chat_middleware, *(middleware or []))
|
|
546
|
+
if not pipeline.has_middlewares:
|
|
547
|
+
if request_message_observer is not None:
|
|
548
|
+
request_message_observer(messages)
|
|
549
|
+
prepared_observer_kwargs = (
|
|
550
|
+
{"request_message_observer": request_message_observer}
|
|
551
|
+
if request_message_observer is not None and isinstance(self.inner, _PreparedRequestObserverClient)
|
|
552
|
+
else {}
|
|
553
|
+
)
|
|
554
|
+
result = self.inner.get_response(
|
|
555
|
+
messages,
|
|
556
|
+
stream=stream,
|
|
557
|
+
options=options,
|
|
558
|
+
function_invocation_kwargs=function_invocation_kwargs,
|
|
559
|
+
**prepared_observer_kwargs,
|
|
560
|
+
**kwargs,
|
|
561
|
+
)
|
|
562
|
+
if stream and stream_update_filter is not None and _is_chat_response_stream(result):
|
|
563
|
+
result.with_update_filter(stream_update_filter)
|
|
564
|
+
return result
|
|
565
|
+
|
|
566
|
+
context = ChatContext(
|
|
567
|
+
client=self,
|
|
568
|
+
messages=list(messages), # Fresh list; middleware must not mutate the caller's container.
|
|
569
|
+
options=options,
|
|
570
|
+
stream=stream,
|
|
571
|
+
kwargs=dict(kwargs),
|
|
572
|
+
function_invocation_kwargs=function_invocation_kwargs,
|
|
573
|
+
stream_update_filters=[stream_update_filter] if stream_update_filter is not None else None,
|
|
574
|
+
request_message_observers=[request_message_observer] if request_message_observer is not None else None,
|
|
575
|
+
)
|
|
576
|
+
|
|
577
|
+
async def _execute() -> Any:
|
|
578
|
+
return await pipeline.execute(context=context, final_handler=self._middleware_handler)
|
|
579
|
+
|
|
580
|
+
if not stream:
|
|
581
|
+
return _execute() # un-awaited coroutine; nothing runs at call time
|
|
582
|
+
|
|
583
|
+
async def _execute_stream() -> ResponseStream[ChatResponseUpdate, ChatResponse]:
|
|
584
|
+
result = await _execute()
|
|
585
|
+
if result is None:
|
|
586
|
+
# Middleware terminated without setting a result.
|
|
587
|
+
return ResponseStream(_EmptyAsyncIterator())
|
|
588
|
+
if _is_chat_response_stream(result):
|
|
589
|
+
return result
|
|
590
|
+
raise ValueError("Expected ResponseStream for streaming, got ChatResponse")
|
|
591
|
+
|
|
592
|
+
# from_awaitable resolves the coroutine on first consumption;
|
|
593
|
+
# construction runs no middleware.
|
|
594
|
+
return ResponseStream.from_awaitable(_execute_stream())
|
|
595
|
+
|
|
596
|
+
def _middleware_handler(
|
|
597
|
+
self, context: ChatContext
|
|
598
|
+
) -> Awaitable[ChatResponse] | ResponseStream[ChatResponseUpdate, ChatResponse]:
|
|
599
|
+
# Re-reads the context AFTER the pipeline ran — this is what makes element
|
|
600
|
+
# swaps and whole-list rebinds of context.messages reach the wire.
|
|
601
|
+
prepared_observer_kwargs: dict[str, Any] = {}
|
|
602
|
+
if context.request_message_observers and isinstance(self.inner, _PreparedRequestObserverClient):
|
|
603
|
+
|
|
604
|
+
def observe_prepared_request(messages: Sequence[Message]) -> None:
|
|
605
|
+
for observer in context.request_message_observers:
|
|
606
|
+
observer(messages)
|
|
607
|
+
|
|
608
|
+
prepared_observer_kwargs["request_message_observer"] = observe_prepared_request
|
|
609
|
+
return self.inner.get_response(
|
|
610
|
+
context.messages,
|
|
611
|
+
stream=context.stream,
|
|
612
|
+
options=context.options or {},
|
|
613
|
+
function_invocation_kwargs=context.function_invocation_kwargs,
|
|
614
|
+
**prepared_observer_kwargs,
|
|
615
|
+
**context.kwargs,
|
|
616
|
+
)
|