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,279 @@
|
|
|
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
|
+
"""Encode chat history as Messages API messages.
|
|
6
|
+
|
|
7
|
+
A chat message becomes one wire message per run of blocks that share a wire
|
|
8
|
+
role, in their original order: tool calls go out as ``assistant`` and local
|
|
9
|
+
tool results as ``user`` whatever message carries them; other blocks, hosted
|
|
10
|
+
results included, keep their message's role. Repairs keep the request
|
|
11
|
+
valid: thinking without a signature is dropped (the API rejects it), and so
|
|
12
|
+
are blank text and a wire message left with no blocks; a tool-call id another
|
|
13
|
+
provider minted (``functions.read_file:0``) is sent as an id the API accepts,
|
|
14
|
+
the same for the call and its result. Thinking another endpoint issued is
|
|
15
|
+
left out: only its issuer can check the signature, and so is thinking a
|
|
16
|
+
request was accepted without after the service refused it as bound to a
|
|
17
|
+
different conversation (:data:`THINKING_STRIPPED_KEY`).
|
|
18
|
+
|
|
19
|
+
Hosted-tool history from another provider is replaced by the neutral summary
|
|
20
|
+
:func:`cross_provider_hosted_degradations` writes, sent as assistant context.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import hashlib
|
|
26
|
+
import logging
|
|
27
|
+
import re
|
|
28
|
+
from collections.abc import Collection, Mapping, Sequence
|
|
29
|
+
from dataclasses import dataclass, replace
|
|
30
|
+
from typing import TYPE_CHECKING, Any, Final
|
|
31
|
+
|
|
32
|
+
from chrys.foundation.hosted_tools import ANTHROPIC_HOSTED_WIRE_BLOCK_KEY
|
|
33
|
+
from chrys.foundation.models.history_markers import ANTHROPIC_THINKING_STRIPPED_KEY as THINKING_STRIPPED_KEY
|
|
34
|
+
from chrys.foundation.reasoning_origin import replays_to
|
|
35
|
+
from chrys.kernel._content import _ANTHROPIC_REDACTED_THINKING_KEY
|
|
36
|
+
from chrys.service.agent_middleware.events.hosted_tools import cross_provider_hosted_degradations
|
|
37
|
+
from chrys.service.llm.images import UNSUPPORTED_IMAGE_TEXT, wire_image
|
|
38
|
+
|
|
39
|
+
if TYPE_CHECKING:
|
|
40
|
+
from chrys.foundation.reasoning_origin import ReasoningOrigin
|
|
41
|
+
from chrys.kernel import Content, Message
|
|
42
|
+
|
|
43
|
+
logger = logging.getLogger(__name__)
|
|
44
|
+
|
|
45
|
+
# Wire roles fixed by a block's type; other blocks take their message's role.
|
|
46
|
+
_ROLE_OF_BLOCK_TYPE: Final[Mapping[str, str]] = {
|
|
47
|
+
"tool_use": "assistant",
|
|
48
|
+
"mcp_tool_use": "assistant",
|
|
49
|
+
"server_tool_use": "assistant",
|
|
50
|
+
"tool_result": "user",
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# The tool-use ids the API accepts.
|
|
55
|
+
_TOOL_ID: Final = re.compile(r"[A-Za-z0-9_-]+")
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@dataclass(frozen=True, slots=True)
|
|
59
|
+
class _Block:
|
|
60
|
+
"""One encoded content block."""
|
|
61
|
+
|
|
62
|
+
wire: dict[str, Any]
|
|
63
|
+
assistant_context: bool = False
|
|
64
|
+
"""Sent as ``assistant`` whatever its type: a summary of foreign hosted-tool history."""
|
|
65
|
+
thinking: tuple[Content, ...] = ()
|
|
66
|
+
"""The reasoning contents a thinking or redacted thinking block is encoded from, a signature it took included."""
|
|
67
|
+
|
|
68
|
+
def role(self, message_role: str) -> str:
|
|
69
|
+
if self.assistant_context:
|
|
70
|
+
return "assistant"
|
|
71
|
+
return _ROLE_OF_BLOCK_TYPE.get(self.wire.get("type"), message_role)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@dataclass(frozen=True, slots=True)
|
|
75
|
+
class EncodedHistory:
|
|
76
|
+
"""The wire messages of a history and the reasoning contents their thinking blocks replay."""
|
|
77
|
+
|
|
78
|
+
messages: list[dict[str, Any]]
|
|
79
|
+
thinking: tuple[Content, ...]
|
|
80
|
+
"""Every content a sent thinking or redacted thinking block is encoded from, each once, in order."""
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def encode_messages(messages: Sequence[Message], *, origin: ReasoningOrigin | None = None) -> list[dict[str, Any]]:
|
|
84
|
+
"""Encode *messages* after a leading system message, which the request sends as ``system``.
|
|
85
|
+
|
|
86
|
+
*origin* is the endpoint the request goes to: thinking, signatures and
|
|
87
|
+
redacted thinking another endpoint issued are left out.
|
|
88
|
+
"""
|
|
89
|
+
return encode_history(messages, origin=origin).messages
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def encode_history(
|
|
93
|
+
messages: Sequence[Message], *, origin: ReasoningOrigin | None = None, skip: Collection[Content] = ()
|
|
94
|
+
) -> EncodedHistory:
|
|
95
|
+
"""Encode *messages* like :func:`encode_messages`, leaving out the thinking of the contents in *skip*.
|
|
96
|
+
|
|
97
|
+
A thinking block is left out when any content it is encoded from is in
|
|
98
|
+
*skip* (by identity) or carries :data:`THINKING_STRIPPED_KEY`. Blocks are
|
|
99
|
+
matched with their signatures first and left out after, so a signature
|
|
100
|
+
never moves to the thinking before the block left out.
|
|
101
|
+
"""
|
|
102
|
+
history = messages[1:] if messages and messages[0].role == "system" else messages
|
|
103
|
+
summaries = cross_provider_hosted_degradations(history, target_provider="anthropic")
|
|
104
|
+
skipped = {id(content) for content in skip}
|
|
105
|
+
wire_messages: list[dict[str, Any]] = []
|
|
106
|
+
thinking: dict[int, Content] = {}
|
|
107
|
+
for message in history:
|
|
108
|
+
role = "assistant" if message.role == "assistant" else "user"
|
|
109
|
+
blocks = [
|
|
110
|
+
block
|
|
111
|
+
for block in _encode_blocks(message, summaries, origin)
|
|
112
|
+
if not any(id(content) in skipped or _was_stripped(content) for content in block.thinking)
|
|
113
|
+
]
|
|
114
|
+
for block in blocks:
|
|
115
|
+
thinking.update((id(content), content) for content in block.thinking)
|
|
116
|
+
wire_messages.extend(_by_role(blocks, role))
|
|
117
|
+
return EncodedHistory(wire_messages, tuple(thinking.values()))
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _was_stripped(content: Content) -> bool:
|
|
121
|
+
return content.additional_properties.get(THINKING_STRIPPED_KEY) is True
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _by_role(blocks: list[_Block], message_role: str) -> list[dict[str, Any]]:
|
|
125
|
+
"""Group consecutive blocks with the same wire role into one wire message each."""
|
|
126
|
+
grouped: list[dict[str, Any]] = []
|
|
127
|
+
for block in blocks:
|
|
128
|
+
role = block.role(message_role)
|
|
129
|
+
if grouped and grouped[-1]["role"] == role:
|
|
130
|
+
grouped[-1]["content"].append(block.wire)
|
|
131
|
+
else:
|
|
132
|
+
grouped.append({"role": role, "content": [block.wire]})
|
|
133
|
+
return grouped
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def _encode_blocks(
|
|
137
|
+
message: Message, summaries: Mapping[int, str | None], origin: ReasoningOrigin | None
|
|
138
|
+
) -> list[_Block]:
|
|
139
|
+
blocks: list[_Block] = []
|
|
140
|
+
for content in message.contents:
|
|
141
|
+
if id(content) in summaries:
|
|
142
|
+
if summary := summaries[id(content)]:
|
|
143
|
+
blocks.append(_Block({"type": "text", "text": summary}, assistant_context=True))
|
|
144
|
+
continue
|
|
145
|
+
# Anthropic's own hosted blocks replay exactly as they were received.
|
|
146
|
+
received = content.additional_properties.get(ANTHROPIC_HOSTED_WIRE_BLOCK_KEY)
|
|
147
|
+
if content.hosted_provider == "anthropic" and isinstance(received, Mapping):
|
|
148
|
+
blocks.append(_Block(dict(received)))
|
|
149
|
+
elif content.type == "text_reasoning":
|
|
150
|
+
if replays_to(content.additional_properties, origin):
|
|
151
|
+
_add_thinking(content, blocks)
|
|
152
|
+
elif (wire := _encode_content(content)) is not None:
|
|
153
|
+
blocks.append(_Block(wire))
|
|
154
|
+
return [block for block in blocks if not _is_unsigned_thinking(block.wire)]
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def _is_unsigned_thinking(wire: Mapping[str, Any]) -> bool:
|
|
158
|
+
# Some gateways omit thinking signatures, and replayed thinking without one
|
|
159
|
+
# fails the request ("signature: Field required"). The reasoning is dropped
|
|
160
|
+
# rather than replayed as visible text.
|
|
161
|
+
return wire.get("type") == "thinking" and not wire.get("signature")
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def _add_thinking(content: Content, blocks: list[_Block]) -> None:
|
|
165
|
+
properties = content.additional_properties
|
|
166
|
+
if properties.get(_ANTHROPIC_REDACTED_THINKING_KEY):
|
|
167
|
+
blocks.append(_Block({"type": "redacted_thinking", "data": content.protected_data}, thinking=(content,)))
|
|
168
|
+
return
|
|
169
|
+
if content.id or properties.get("reasoning_text") or properties.get("openai_reasoning_format"):
|
|
170
|
+
# Another protocol's reasoning (Responses items carry an id and a
|
|
171
|
+
# marker, Chat Completions dialects stamp their format): sending it as
|
|
172
|
+
# thinking would forge a signature.
|
|
173
|
+
return
|
|
174
|
+
if content.text is None and content.protected_data:
|
|
175
|
+
# A streamed signature arrives as its own fragment and signs the
|
|
176
|
+
# thinking block before it.
|
|
177
|
+
previous = blocks[-1] if blocks else None
|
|
178
|
+
if previous is not None and previous.wire.get("type") == "thinking" and "signature" not in previous.wire:
|
|
179
|
+
previous.wire["signature"] = content.protected_data
|
|
180
|
+
blocks[-1] = replace(previous, thinking=(*previous.thinking, content))
|
|
181
|
+
return
|
|
182
|
+
# Thinking streamed without its text (an empty start and an empty delta)
|
|
183
|
+
# assembles with no text and the start's empty signature: it is an empty
|
|
184
|
+
# block, which the signature fragment after it signs; without one, the
|
|
185
|
+
# block is unsigned and dropped.
|
|
186
|
+
thinking: dict[str, Any] = {"type": "thinking", "thinking": content.text or ""}
|
|
187
|
+
if content.protected_data:
|
|
188
|
+
thinking["signature"] = content.protected_data
|
|
189
|
+
blocks.append(_Block(thinking, thinking=(content,)))
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def _encode_content(content: Content) -> dict[str, Any] | None:
|
|
193
|
+
match content.type:
|
|
194
|
+
case "text":
|
|
195
|
+
# The API rejects blank text blocks.
|
|
196
|
+
return {"type": "text", "text": content.text} if content.text and not content.text.isspace() else None
|
|
197
|
+
case "data" | "uri":
|
|
198
|
+
if (image := _image_block(content)) is None:
|
|
199
|
+
logger.debug("Ignoring unsupported data content media type: %s", content.media_type)
|
|
200
|
+
return image
|
|
201
|
+
case "function_call":
|
|
202
|
+
return {
|
|
203
|
+
"type": "tool_use",
|
|
204
|
+
"id": _wire_tool_id(content.call_id),
|
|
205
|
+
"name": content.name,
|
|
206
|
+
"input": content.parse_arguments(),
|
|
207
|
+
}
|
|
208
|
+
case "function_result":
|
|
209
|
+
return {
|
|
210
|
+
"type": "tool_result",
|
|
211
|
+
"tool_use_id": _wire_tool_id(content.call_id),
|
|
212
|
+
"content": _tool_result_blocks(content) or _tool_result_text(content.result),
|
|
213
|
+
"is_error": content.exception is not None,
|
|
214
|
+
}
|
|
215
|
+
case "mcp_server_tool_call":
|
|
216
|
+
return {
|
|
217
|
+
"type": "mcp_tool_use",
|
|
218
|
+
"id": _wire_tool_id(content.call_id),
|
|
219
|
+
"name": content.tool_name,
|
|
220
|
+
"server_name": content.server_name or "",
|
|
221
|
+
"input": content.parse_arguments() or {},
|
|
222
|
+
}
|
|
223
|
+
case "mcp_server_tool_result":
|
|
224
|
+
return {
|
|
225
|
+
"type": "mcp_tool_result",
|
|
226
|
+
"tool_use_id": _wire_tool_id(content.call_id),
|
|
227
|
+
"content": content.output if content.output is not None else "",
|
|
228
|
+
}
|
|
229
|
+
case _:
|
|
230
|
+
logger.debug("Ignoring unsupported content type: %s", content.type)
|
|
231
|
+
return None
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def _wire_tool_id(call_id: str | None) -> str | None:
|
|
235
|
+
"""*call_id* as an id the API accepts.
|
|
236
|
+
|
|
237
|
+
An id it rejects maps to one derived from its value, so a call and its
|
|
238
|
+
result keep matching. An empty id is sent as it is.
|
|
239
|
+
"""
|
|
240
|
+
if not call_id or _TOOL_ID.fullmatch(call_id):
|
|
241
|
+
return call_id
|
|
242
|
+
digest = hashlib.sha256(call_id.encode("utf-8", "surrogatepass")).hexdigest()
|
|
243
|
+
return f"toolu_chrys_{digest[:32]}"
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def _tool_result_text(result: Any) -> Any:
|
|
247
|
+
"""A tool result's own value, or ``""`` for none or blank text, which the API rejects."""
|
|
248
|
+
if result is None or (isinstance(result, str) and result.isspace()):
|
|
249
|
+
return ""
|
|
250
|
+
return result
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def _tool_result_blocks(result: Content) -> list[dict[str, Any]]:
|
|
254
|
+
"""The text and image items of a tool result; blank text and other items are not sent."""
|
|
255
|
+
blocks: list[dict[str, Any]] = []
|
|
256
|
+
for item in result.items or ():
|
|
257
|
+
if item.type == "text":
|
|
258
|
+
if item.text and not item.text.isspace():
|
|
259
|
+
blocks.append({"type": "text", "text": item.text})
|
|
260
|
+
elif item.type in ("data", "uri") and (image := _image_block(item)) is not None:
|
|
261
|
+
blocks.append(image)
|
|
262
|
+
else:
|
|
263
|
+
logger.debug("Ignoring unsupported rich content media type in tool result: %s", item.media_type)
|
|
264
|
+
return blocks
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def _image_block(content: Content) -> dict[str, Any] | None:
|
|
268
|
+
"""A ``data`` or ``uri`` content as an image block; None when it is no image.
|
|
269
|
+
|
|
270
|
+
An image the API can't read goes out as a text block saying so; a link
|
|
271
|
+
saved without a type (older sessions kept MCP links that way) is no image.
|
|
272
|
+
"""
|
|
273
|
+
if content.media_type is None or not content.has_top_level_media_type("image"):
|
|
274
|
+
return None
|
|
275
|
+
if (image := wire_image(content)) is None:
|
|
276
|
+
return {"type": "text", "text": UNSUPPORTED_IMAGE_TEXT}
|
|
277
|
+
if image.data is not None:
|
|
278
|
+
return {"type": "image", "source": {"data": image.data, "media_type": image.media_type, "type": "base64"}}
|
|
279
|
+
return {"type": "image", "source": {"type": "url", "url": image.uri}}
|
|
@@ -0,0 +1,323 @@
|
|
|
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
|
+
"""Build the ``messages.create`` arguments of one call.
|
|
6
|
+
|
|
7
|
+
:func:`build_request` decides every request field: the renamed chat options,
|
|
8
|
+
the default output cap, the encoded history and system prompt, the thinking
|
|
9
|
+
block binding, the ``anthropic-beta`` header, the user id, tool declarations
|
|
10
|
+
and structured output. The client stamps its Chrys headers on the result.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import logging
|
|
16
|
+
from collections.abc import Collection, Iterable, Mapping, Sequence
|
|
17
|
+
from dataclasses import dataclass
|
|
18
|
+
from typing import TYPE_CHECKING, Any, Final
|
|
19
|
+
|
|
20
|
+
from chrys.kernel import (
|
|
21
|
+
ChatClientInvalidRequestException,
|
|
22
|
+
FunctionTool,
|
|
23
|
+
Message,
|
|
24
|
+
normalize_tools,
|
|
25
|
+
prepend_instructions_to_messages,
|
|
26
|
+
validate_tool_mode,
|
|
27
|
+
)
|
|
28
|
+
from chrys.service.profiles.models.options import AUTO_INTERLEAVED_THINKING_OPTION, THINKING_BLOCK_BINDING_OPTION
|
|
29
|
+
|
|
30
|
+
from .history import encode_history
|
|
31
|
+
from .thinking_binding import (
|
|
32
|
+
BINDING_CONTROLS_BETA,
|
|
33
|
+
INTERLEAVED_THINKING_BETA,
|
|
34
|
+
ThinkingBindingPolicy,
|
|
35
|
+
apply_thinking_binding,
|
|
36
|
+
resolve_thinking_binding,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
if TYPE_CHECKING:
|
|
40
|
+
from pydantic import BaseModel
|
|
41
|
+
|
|
42
|
+
from chrys.foundation.reasoning_origin import ReasoningOrigin
|
|
43
|
+
from chrys.kernel import Content
|
|
44
|
+
|
|
45
|
+
logger = logging.getLogger(__name__)
|
|
46
|
+
|
|
47
|
+
DEFAULT_BETAS: Final = ("mcp-client-2025-04-04", "code-execution-2025-08-25")
|
|
48
|
+
"""Betas every request enables unless its ``extra_headers`` name the betas themselves."""
|
|
49
|
+
|
|
50
|
+
BETA_HEADER: Final = "anthropic-beta"
|
|
51
|
+
|
|
52
|
+
FALLBACK_MAX_OUTPUT_TOKENS: Final = 16 * 1024
|
|
53
|
+
"""Output cap of a call that sets none: the Messages API requires one.
|
|
54
|
+
|
|
55
|
+
Profile-driven calls never use it: ``effective_chat_options`` gives every
|
|
56
|
+
live request the profile's ``max_output_tokens``, whose default
|
|
57
|
+
(``DEFAULT_MAX_OUTPUT_TOKENS`` in ``chrys.service.profiles.models.schema``)
|
|
58
|
+
is a deliberately separate constant.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
# (chat option, Messages API field) pairs; an explicit field wins over its option.
|
|
62
|
+
_RENAMED_OPTIONS: Final = (("stop", "stop_sequences"), ("instructions", "system"))
|
|
63
|
+
|
|
64
|
+
# Chat options build_request reads itself instead of copying them, and ``stream``,
|
|
65
|
+
# which the call site sets.
|
|
66
|
+
_OPTIONS_NOT_COPIED: Final = frozenset(
|
|
67
|
+
{
|
|
68
|
+
"instructions",
|
|
69
|
+
"response_format",
|
|
70
|
+
"additional_beta_flags",
|
|
71
|
+
"betas",
|
|
72
|
+
"allow_multiple_tool_calls",
|
|
73
|
+
"stream",
|
|
74
|
+
THINKING_BLOCK_BINDING_OPTION,
|
|
75
|
+
AUTO_INTERLEAVED_THINKING_OPTION,
|
|
76
|
+
}
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
# Call keywords that configure the call and never become request fields. The
|
|
80
|
+
# betas and thinking settings are read from the options only.
|
|
81
|
+
_CALL_SETTINGS: Final = frozenset(
|
|
82
|
+
{
|
|
83
|
+
"thread",
|
|
84
|
+
"middleware",
|
|
85
|
+
"additional_beta_flags",
|
|
86
|
+
"betas",
|
|
87
|
+
THINKING_BLOCK_BINDING_OPTION,
|
|
88
|
+
AUTO_INTERLEAVED_THINKING_OPTION,
|
|
89
|
+
}
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@dataclass(frozen=True, slots=True)
|
|
94
|
+
class BuiltRequest:
|
|
95
|
+
"""The ``messages.create`` arguments of one call and what they replay."""
|
|
96
|
+
|
|
97
|
+
request: dict[str, Any]
|
|
98
|
+
policy: ThinkingBindingPolicy
|
|
99
|
+
thinking: tuple[Content, ...]
|
|
100
|
+
"""The reasoning contents the request's thinking blocks replay; none when ``extra_body`` sends its own messages."""
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def build_request(
|
|
104
|
+
messages: Sequence[Message],
|
|
105
|
+
options: Mapping[str, Any],
|
|
106
|
+
call_kwargs: Mapping[str, Any],
|
|
107
|
+
*,
|
|
108
|
+
model: str,
|
|
109
|
+
base_url: object,
|
|
110
|
+
default_headers: Mapping[str, object],
|
|
111
|
+
origin: ReasoningOrigin | None = None,
|
|
112
|
+
skip_thinking: Collection[Content] = (),
|
|
113
|
+
) -> BuiltRequest:
|
|
114
|
+
"""Return the request for *messages* under *options*, without Chrys headers, and what it replays.
|
|
115
|
+
|
|
116
|
+
Options set to None are left out. Call keywords become request fields too,
|
|
117
|
+
except private (underscore) names and :data:`_CALL_SETTINGS`. *model* is
|
|
118
|
+
used when neither sets one. *base_url* is where the SDK client sends the
|
|
119
|
+
request and *default_headers* the headers it adds to every request.
|
|
120
|
+
*origin* is the endpoint the request goes to: thinking another one issued
|
|
121
|
+
is left out, and so is the thinking of the contents in *skip_thinking*.
|
|
122
|
+
The result's ``thinking`` lists the reasoning contents the request
|
|
123
|
+
replays: passed back as *skip_thinking*, they build the same request
|
|
124
|
+
without that thinking.
|
|
125
|
+
"""
|
|
126
|
+
if instructions := options.get("instructions"):
|
|
127
|
+
messages = prepend_instructions_to_messages(list(messages), instructions, role="system")
|
|
128
|
+
|
|
129
|
+
request = {key: value for key, value in options.items() if value is not None and key not in _OPTIONS_NOT_COPIED}
|
|
130
|
+
_rename_options(request)
|
|
131
|
+
call_fields = {
|
|
132
|
+
key: value for key, value in call_kwargs.items() if not key.startswith("_") and key not in _CALL_SETTINGS
|
|
133
|
+
}
|
|
134
|
+
_rename_options(call_fields)
|
|
135
|
+
request.update(call_fields)
|
|
136
|
+
|
|
137
|
+
if not request.get("model"):
|
|
138
|
+
if not model:
|
|
139
|
+
raise ValueError("model must be a non-empty string")
|
|
140
|
+
request["model"] = model
|
|
141
|
+
if not request.get("max_tokens"):
|
|
142
|
+
request["max_tokens"] = FALLBACK_MAX_OUTPUT_TOKENS
|
|
143
|
+
policy = resolve_thinking_binding(request, options, base_url=base_url)
|
|
144
|
+
apply_thinking_binding(request, policy)
|
|
145
|
+
history = encode_history(messages, origin=origin, skip=skip_thinking)
|
|
146
|
+
request["messages"] = history.messages
|
|
147
|
+
if messages and isinstance(messages[0], Message) and messages[0].role == "system":
|
|
148
|
+
request["system"] = messages[0].text
|
|
149
|
+
request["extra_headers"] = _with_beta_header(request.get("extra_headers"), options, default_headers, policy)
|
|
150
|
+
if user := request.pop("user", None):
|
|
151
|
+
# The Messages API takes the end-user id as ``metadata.user_id``.
|
|
152
|
+
metadata = dict(request.get("metadata") or {})
|
|
153
|
+
if "user_id" not in metadata:
|
|
154
|
+
metadata["user_id"] = user
|
|
155
|
+
request["metadata"] = metadata
|
|
156
|
+
if tool_fields := encode_tools(options):
|
|
157
|
+
request.update(tool_fields)
|
|
158
|
+
if (response_format := options.get("response_format")) is not None:
|
|
159
|
+
request["output_config"] = _output_config_with_format(request.get("output_config"), response_format)
|
|
160
|
+
extra_body = request.get("extra_body")
|
|
161
|
+
sends_own_messages = isinstance(extra_body, Mapping) and "messages" in extra_body
|
|
162
|
+
return BuiltRequest(request, policy, () if sends_own_messages else history.thinking)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _with_beta_header(
|
|
166
|
+
extra_headers: object,
|
|
167
|
+
options: Mapping[str, Any],
|
|
168
|
+
default_headers: Mapping[str, object],
|
|
169
|
+
policy: ThinkingBindingPolicy,
|
|
170
|
+
) -> dict[str, Any]:
|
|
171
|
+
"""*extra_headers* with one ``anthropic-beta`` header in place of every spelling of it.
|
|
172
|
+
|
|
173
|
+
The header lists :data:`DEFAULT_BETAS`, ``additional_beta_flags``,
|
|
174
|
+
``betas`` and the client's default ``anthropic-beta`` header, in that
|
|
175
|
+
order; an ``anthropic-beta`` header *extra_headers* names itself replaces
|
|
176
|
+
them all. The betas *policy* needs follow either way. Comma-separated
|
|
177
|
+
values are split, and each beta is listed once. A request with no beta
|
|
178
|
+
gets no header.
|
|
179
|
+
"""
|
|
180
|
+
headers = dict(extra_headers) if isinstance(extra_headers, Mapping) else {}
|
|
181
|
+
if any(_is_beta_header(name) and not isinstance(value, str) for name, value in headers.items()):
|
|
182
|
+
# Left as written, so the request's header check refuses the value.
|
|
183
|
+
return headers
|
|
184
|
+
explicit = [headers.pop(name) for name in list(headers) if _is_beta_header(name)]
|
|
185
|
+
sources: list[object] = explicit or [
|
|
186
|
+
DEFAULT_BETAS,
|
|
187
|
+
options.get("additional_beta_flags"),
|
|
188
|
+
options.get("betas"),
|
|
189
|
+
*(value for name, value in default_headers.items() if _is_beta_header(name) and isinstance(value, str)),
|
|
190
|
+
]
|
|
191
|
+
if policy.controls_beta:
|
|
192
|
+
sources.append(BINDING_CONTROLS_BETA)
|
|
193
|
+
if policy.interleaved_beta:
|
|
194
|
+
sources.append(INTERLEAVED_THINKING_BETA)
|
|
195
|
+
if betas := dict.fromkeys(beta for source in sources for beta in _betas_in(source)):
|
|
196
|
+
headers[BETA_HEADER] = ",".join(betas)
|
|
197
|
+
return headers
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _is_beta_header(name: object) -> bool:
|
|
201
|
+
return isinstance(name, str) and name.lower() == BETA_HEADER
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def _betas_in(value: object) -> list[str]:
|
|
205
|
+
"""The betas a string, or each item of a list, names: comma-separated, blanks dropped."""
|
|
206
|
+
if value is None:
|
|
207
|
+
return []
|
|
208
|
+
items = value if isinstance(value, Iterable) and not isinstance(value, str | Mapping) else [value]
|
|
209
|
+
return [beta for item in items for beta in (part.strip() for part in str(item).split(",")) if beta]
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def _rename_options(fields: dict[str, Any]) -> None:
|
|
213
|
+
for option, field in _RENAMED_OPTIONS:
|
|
214
|
+
if option in fields:
|
|
215
|
+
fields.setdefault(field, fields.pop(option))
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def encode_tools(options: Mapping[str, Any]) -> dict[str, Any] | None:
|
|
219
|
+
"""Encode the call's tools and tool choice; None when there are neither.
|
|
220
|
+
|
|
221
|
+
A function tool becomes a ``custom`` declaration, an ``mcp`` mapping an
|
|
222
|
+
``mcp_servers`` entry; any other tool is a provider declaration and is
|
|
223
|
+
sent as given.
|
|
224
|
+
"""
|
|
225
|
+
fields: dict[str, Any] = {}
|
|
226
|
+
if tools := options.get("tools"):
|
|
227
|
+
declarations: list[Any] = []
|
|
228
|
+
mcp_servers: list[dict[str, Any]] = []
|
|
229
|
+
for tool in normalize_tools(tools):
|
|
230
|
+
if isinstance(tool, FunctionTool):
|
|
231
|
+
declarations.append(
|
|
232
|
+
{
|
|
233
|
+
"type": "custom",
|
|
234
|
+
"name": tool.name,
|
|
235
|
+
"description": tool.description,
|
|
236
|
+
"input_schema": tool.parameters(),
|
|
237
|
+
}
|
|
238
|
+
)
|
|
239
|
+
elif isinstance(tool, Mapping) and tool.get("type") == "mcp":
|
|
240
|
+
mcp_servers.append(_mcp_server(tool))
|
|
241
|
+
else:
|
|
242
|
+
declarations.append(tool)
|
|
243
|
+
if declarations:
|
|
244
|
+
fields["tools"] = declarations
|
|
245
|
+
if mcp_servers:
|
|
246
|
+
fields["mcp_servers"] = mcp_servers
|
|
247
|
+
if (tool_choice := _tool_choice(options)) is not None:
|
|
248
|
+
fields["tool_choice"] = tool_choice
|
|
249
|
+
return fields or None
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def _mcp_server(tool: Mapping[str, Any]) -> dict[str, Any]:
|
|
253
|
+
server: dict[str, Any] = {"type": "url", "name": tool.get("server_label", ""), "url": tool.get("server_url", "")}
|
|
254
|
+
allowed_tools = tool.get("allowed_tools")
|
|
255
|
+
if isinstance(allowed_tools, Sequence) and not isinstance(allowed_tools, str):
|
|
256
|
+
server["tool_configuration"] = {"allowed_tools": [str(name) for name in allowed_tools]}
|
|
257
|
+
headers = tool.get("headers")
|
|
258
|
+
authorization = headers.get("authorization") if isinstance(headers, Mapping) else None
|
|
259
|
+
if isinstance(authorization, str):
|
|
260
|
+
server["authorization_token"] = authorization
|
|
261
|
+
return server
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def _tool_choice(options: Mapping[str, Any]) -> dict[str, Any] | None:
|
|
265
|
+
if options.get("tool_choice") is None:
|
|
266
|
+
return None
|
|
267
|
+
tool_mode = validate_tool_mode(options.get("tool_choice"))
|
|
268
|
+
if tool_mode is None:
|
|
269
|
+
return None
|
|
270
|
+
if "allowed_tools" in tool_mode:
|
|
271
|
+
logger.warning("allowed_tools is not supported by Anthropic; the setting will be ignored")
|
|
272
|
+
choice: dict[str, Any]
|
|
273
|
+
match tool_mode.get("mode"):
|
|
274
|
+
case "none":
|
|
275
|
+
return {"type": "none"}
|
|
276
|
+
case "auto":
|
|
277
|
+
choice = {"type": "auto"}
|
|
278
|
+
case "required" if "required_function_name" in tool_mode:
|
|
279
|
+
choice = {"type": "tool", "name": tool_mode["required_function_name"]}
|
|
280
|
+
case "required":
|
|
281
|
+
choice = {"type": "any"}
|
|
282
|
+
case _:
|
|
283
|
+
logger.debug("Ignoring unsupported tool choice mode: %s", tool_mode)
|
|
284
|
+
return None
|
|
285
|
+
# The choice carries the parallel-call setting; it is no request field of its own.
|
|
286
|
+
if (allow_multiple := options.get("allow_multiple_tool_calls")) is not None:
|
|
287
|
+
choice["disable_parallel_tool_use"] = not allow_multiple
|
|
288
|
+
return choice
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
def _output_config_with_format(output_config: Any, response_format: Any) -> dict[str, Any]:
|
|
292
|
+
if output_config is None:
|
|
293
|
+
merged: dict[str, Any] = {}
|
|
294
|
+
elif isinstance(output_config, Mapping):
|
|
295
|
+
merged = dict(output_config)
|
|
296
|
+
else:
|
|
297
|
+
raise ChatClientInvalidRequestException("output_config must be a mapping.")
|
|
298
|
+
if merged.get("format") is not None:
|
|
299
|
+
raise ChatClientInvalidRequestException(
|
|
300
|
+
"response_format cannot be combined with explicit output_config.format."
|
|
301
|
+
)
|
|
302
|
+
merged["format"] = encode_output_format(response_format)
|
|
303
|
+
return merged
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def encode_output_format(response_format: type[BaseModel] | dict[str, Any]) -> dict[str, Any]:
|
|
307
|
+
"""The ``output_config.format`` value for a Pydantic model or a JSON-schema mapping.
|
|
308
|
+
|
|
309
|
+
A mapping may carry its schema under ``json_schema.schema`` or ``schema``,
|
|
310
|
+
or be the schema itself. The schema is sent closed to extra properties.
|
|
311
|
+
"""
|
|
312
|
+
schema = _json_schema(response_format)
|
|
313
|
+
if isinstance(schema, dict):
|
|
314
|
+
schema = {**schema, "additionalProperties": False}
|
|
315
|
+
return {"type": "json_schema", "schema": schema}
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
def _json_schema(response_format: type[BaseModel] | dict[str, Any]) -> Any:
|
|
319
|
+
if not isinstance(response_format, dict):
|
|
320
|
+
return response_format.model_json_schema()
|
|
321
|
+
if "json_schema" in response_format:
|
|
322
|
+
return response_format["json_schema"].get("schema", {})
|
|
323
|
+
return response_format.get("schema", response_format)
|