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
chrys/app/acp/content.py
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""ACP content conversion for Chrys user turns."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import base64
|
|
8
|
+
import binascii
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
|
|
11
|
+
from acp.schema import (
|
|
12
|
+
AudioContentBlock,
|
|
13
|
+
BlobResourceContents,
|
|
14
|
+
EmbeddedResourceContentBlock,
|
|
15
|
+
ImageContentBlock,
|
|
16
|
+
ResourceContentBlock,
|
|
17
|
+
TextContentBlock,
|
|
18
|
+
TextResourceContents,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
from chrys.foundation.branding import APP_DISPLAY_NAME
|
|
22
|
+
from chrys.foundation.events.types import UserMessage
|
|
23
|
+
from chrys.foundation.text.images import wire_image_media_type
|
|
24
|
+
from chrys.kernel import Content
|
|
25
|
+
from chrys.orchestration.engine.run.attachments import MAX_IMAGE_BYTES
|
|
26
|
+
|
|
27
|
+
_MAX_BASE64_IMAGE_CHARS = ((MAX_IMAGE_BYTES + 2) // 3) * 4
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class AcpContentError(ValueError):
|
|
31
|
+
"""Raised when ACP prompt content cannot be represented by Chrys."""
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass(frozen=True)
|
|
35
|
+
class ConvertedPrompt:
|
|
36
|
+
"""Chrys user message derived from ACP prompt content."""
|
|
37
|
+
|
|
38
|
+
message: UserMessage
|
|
39
|
+
has_images: bool = False
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
ContentBlock = (
|
|
43
|
+
TextContentBlock | ImageContentBlock | AudioContentBlock | ResourceContentBlock | EmbeddedResourceContentBlock
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def convert_prompt_blocks(blocks: list[ContentBlock], *, vision_enabled: bool) -> ConvertedPrompt:
|
|
48
|
+
"""Convert ACP prompt blocks into a Chrys ``UserMessage``."""
|
|
49
|
+
text_parts: list[str] = []
|
|
50
|
+
image_contents: list[Content] = []
|
|
51
|
+
|
|
52
|
+
for block in blocks:
|
|
53
|
+
if isinstance(block, TextContentBlock):
|
|
54
|
+
text_parts.append(block.text)
|
|
55
|
+
continue
|
|
56
|
+
if isinstance(block, ResourceContentBlock):
|
|
57
|
+
text_parts.append(_format_resource_link(block))
|
|
58
|
+
continue
|
|
59
|
+
if isinstance(block, EmbeddedResourceContentBlock):
|
|
60
|
+
text_parts.append(_format_embedded_resource(block))
|
|
61
|
+
continue
|
|
62
|
+
if isinstance(block, ImageContentBlock):
|
|
63
|
+
if not vision_enabled:
|
|
64
|
+
msg = "This session's model profile does not support image input."
|
|
65
|
+
raise AcpContentError(msg)
|
|
66
|
+
image_contents.append(_image_content(block))
|
|
67
|
+
continue
|
|
68
|
+
if isinstance(block, AudioContentBlock):
|
|
69
|
+
msg = f"Audio content is not supported by {APP_DISPLAY_NAME} ACP phase 1."
|
|
70
|
+
raise AcpContentError(msg)
|
|
71
|
+
msg = f"Unsupported ACP content block: {type(block).__name__}"
|
|
72
|
+
raise AcpContentError(msg)
|
|
73
|
+
|
|
74
|
+
text = "\n\n".join(part for part in text_parts if part)
|
|
75
|
+
message = UserMessage(text=text)
|
|
76
|
+
if image_contents:
|
|
77
|
+
message.prepared_contents = [text, *image_contents]
|
|
78
|
+
return ConvertedPrompt(message=message, has_images=bool(image_contents))
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _format_resource_link(block: ResourceContentBlock) -> str:
|
|
82
|
+
lines = [f"Resource link: {block.name}", f"URI: {block.uri}"]
|
|
83
|
+
if block.title:
|
|
84
|
+
lines.append(f"Title: {block.title}")
|
|
85
|
+
if block.mime_type:
|
|
86
|
+
lines.append(f"MIME type: {block.mime_type}")
|
|
87
|
+
if block.description:
|
|
88
|
+
lines.append(f"Description: {block.description}")
|
|
89
|
+
if block.size is not None:
|
|
90
|
+
lines.append(f"Size: {block.size} bytes")
|
|
91
|
+
return "\n".join(lines)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _format_embedded_resource(block: EmbeddedResourceContentBlock) -> str:
|
|
95
|
+
resource = block.resource
|
|
96
|
+
if isinstance(resource, TextResourceContents):
|
|
97
|
+
heading = f"Embedded resource: {resource.uri}"
|
|
98
|
+
if resource.mime_type:
|
|
99
|
+
heading = f"{heading} ({resource.mime_type})"
|
|
100
|
+
return f"{heading}\n\n{resource.text}"
|
|
101
|
+
if isinstance(resource, BlobResourceContents):
|
|
102
|
+
msg = f"Embedded blob resources are not supported by {APP_DISPLAY_NAME} ACP phase 1."
|
|
103
|
+
raise AcpContentError(msg)
|
|
104
|
+
msg = f"Unsupported embedded resource: {type(resource).__name__}"
|
|
105
|
+
raise AcpContentError(msg)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _image_content(block: ImageContentBlock) -> Content:
|
|
109
|
+
mime_type = block.mime_type.strip().lower()
|
|
110
|
+
if not mime_type.startswith("image/"):
|
|
111
|
+
msg = f"Unsupported image MIME type: {block.mime_type}"
|
|
112
|
+
raise AcpContentError(msg)
|
|
113
|
+
if len(block.data) > _MAX_BASE64_IMAGE_CHARS:
|
|
114
|
+
msg = f"Image content exceeds the {MAX_IMAGE_BYTES // (1024 * 1024)} MB limit."
|
|
115
|
+
raise AcpContentError(msg)
|
|
116
|
+
try:
|
|
117
|
+
data = base64.b64decode(block.data, validate=True)
|
|
118
|
+
except (binascii.Error, ValueError) as exc:
|
|
119
|
+
msg = "Image content is not valid base64."
|
|
120
|
+
raise AcpContentError(msg) from exc
|
|
121
|
+
if not data:
|
|
122
|
+
msg = "Image content is empty."
|
|
123
|
+
raise AcpContentError(msg)
|
|
124
|
+
if len(data) > MAX_IMAGE_BYTES:
|
|
125
|
+
msg = f"Image content exceeds the {MAX_IMAGE_BYTES // (1024 * 1024)} MB limit."
|
|
126
|
+
raise AcpContentError(msg)
|
|
127
|
+
# The bytes name the type: a mislabelled or unreadable image would fail
|
|
128
|
+
# every later request of the session.
|
|
129
|
+
if (media_type := wire_image_media_type(data, None)) is None:
|
|
130
|
+
msg = "Unsupported image format. Use PNG, JPEG, GIF, or WebP."
|
|
131
|
+
raise AcpContentError(msg)
|
|
132
|
+
return Content.from_data(data=data, media_type=media_type)
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
# Chrys ACP Frontend API
|
|
2
|
+
|
|
3
|
+
Reference for the ACP surface that non-TUI clients (e.g. the VS Code extension)
|
|
4
|
+
use to reach parity with the Textual TUI. Source of truth is the code — keep this
|
|
5
|
+
in sync with:
|
|
6
|
+
|
|
7
|
+
- `src/chrys/app/acp/server.py` — request routing, standard methods, notifications
|
|
8
|
+
- `src/chrys/app/acp/session_manager.py` — session/profile/config backend behavior
|
|
9
|
+
|
|
10
|
+
Related issue: #355.
|
|
11
|
+
|
|
12
|
+
## Design model
|
|
13
|
+
|
|
14
|
+
Chrys has one backend runtime (`AgentEngine` + `ChrysSessionHost`) driven by an
|
|
15
|
+
internal `EventBus`. Two frontends consume it:
|
|
16
|
+
|
|
17
|
+
- **TUI** — subscribes to `EventBus` events directly and calls engine/session
|
|
18
|
+
helpers in-process.
|
|
19
|
+
- **ACP clients** — speak standard ACP plus a set of Chrys-private extensions.
|
|
20
|
+
|
|
21
|
+
Goal: a *symmetric frontend contract* — anything the TUI can do, an ACP client can
|
|
22
|
+
do through ACP, without reaching into Chrys internals.
|
|
23
|
+
|
|
24
|
+
Direction principles:
|
|
25
|
+
|
|
26
|
+
1. ACP clients never call Chrys internals. Missing capability becomes an ACP
|
|
27
|
+
method/event, not a private import.
|
|
28
|
+
2. Prefer standard ACP. Only fall back to an extension when ACP has no concept for
|
|
29
|
+
the capability (see *Standard vs. extension* below).
|
|
30
|
+
3. Events describe runtime *facts*; each frontend renders them its own way — no
|
|
31
|
+
frontend-specific payload shapes.
|
|
32
|
+
4. Some UI stays frontend-native even with a shared backend: editor diff rendering,
|
|
33
|
+
terminal integration, file pickers, notifications, settings UI.
|
|
34
|
+
5. Extensions use the `chrys/*`, `session/*`, `sub_agent/*`, `profiles/*`,
|
|
35
|
+
`settings/*`, or `mcp/*` namespaces and are documented here.
|
|
36
|
+
|
|
37
|
+
## Transport
|
|
38
|
+
|
|
39
|
+
Standard ACP methods are dispatched by name. Everything Chrys-specific rides on two
|
|
40
|
+
ACP escape hatches:
|
|
41
|
+
|
|
42
|
+
- **`ext_method(method, params)`** — request/response. Client → backend for
|
|
43
|
+
actions/queries; backend → client for `chrys/request_input` (the `ask_user`
|
|
44
|
+
callback). Dispatched by the `method` string in `ChrysAcpServer.ext_method`.
|
|
45
|
+
- **`ext_notification(method, params)`** — one-way backend → client push, bridged
|
|
46
|
+
from `EventBus` events in `_handle_chrys_extension_event`.
|
|
47
|
+
|
|
48
|
+
Param keys are camelCase; most request handlers also accept the legacy
|
|
49
|
+
`session_id` spelling. Unknown methods raise JSON-RPC `method_not_found`.
|
|
50
|
+
|
|
51
|
+
## Standard ACP
|
|
52
|
+
|
|
53
|
+
Implemented standard methods:
|
|
54
|
+
|
|
55
|
+
- Lifecycle: `initialize`, `session/new`, `session/load`, `session/list`,
|
|
56
|
+
`session/prompt`, `session/cancel`, `session/close`, and the top-level
|
|
57
|
+
`delete_session`.
|
|
58
|
+
- Server → client: `session/request_permission` (approvals), `session/update`
|
|
59
|
+
(agent message/thought chunks, tool calls, `usage_update`, `session_info_update`,
|
|
60
|
+
`current_mode_update`, `plan`). The `plan` update mirrors the builtin todo
|
|
61
|
+
list: streamed live from `TodoListUpdated` events during a turn, and re-seeded
|
|
62
|
+
unconditionally (empty entries = clear) on `session/new`, `session/load`, and
|
|
63
|
+
after `session/rollback` — both to a turn and to welcome.
|
|
64
|
+
|
|
65
|
+
`session/prompt` takes text, resource links and embedded text resources (sent as
|
|
66
|
+
text), and, when the model profile has vision, images. An image needs an `image/*`
|
|
67
|
+
`mimeType`, but its bytes name its type; anything but PNG, JPEG, GIF or WebP fails
|
|
68
|
+
the whole prompt with `invalid_params`. Audio and embedded blob resources fail the same way.
|
|
69
|
+
|
|
70
|
+
`session/new` and `session/load` accept `additionalDirectories` (advertised via
|
|
71
|
+
`SessionCapabilities.additionalDirectories` in `initialize` so clients surface the
|
|
72
|
+
option); the manager builds a multi-dir `Workspace` and passes it to
|
|
73
|
+
`ChrysSessionHost(workspace=...)`. All `cwd` / `additionalDirectories` paths must be
|
|
74
|
+
**absolute** (ACP contract) — a relative path is rejected rather than resolved against
|
|
75
|
+
the ACP server's process cwd, which would bind the session to the wrong workspace.
|
|
76
|
+
On `session/load` of an inactive session, supplied `additionalDirectories` are
|
|
77
|
+
**authoritative** and replace the saved additional roots, with the primary cwd kept
|
|
78
|
+
first so an unchanged scope still reuses an OpenAI Responses service session. A
|
|
79
|
+
non-empty list narrows/swaps scope; an explicit empty list `[]` clears the saved roots
|
|
80
|
+
entirely; omitting the field (`null`/absent) keeps the saved roots. A moved cwd also
|
|
81
|
+
drops them. Reloading an already-active session with `additionalDirectories` at all
|
|
82
|
+
(any list, including `[]`, or MCP overlays) is rejected — roots can't be rebuilt on a
|
|
83
|
+
running host, so the session must be closed first rather than silently keeping the old
|
|
84
|
+
scope. `session/list` treats a non-empty `additionalDirectories` list as an exact,
|
|
85
|
+
ordered additional-root filter (roots validated absolute like new/load): only
|
|
86
|
+
sessions whose saved extra roots match exactly are returned. When omitted or empty,
|
|
87
|
+
all sessions for the `cwd` are returned (each session reports its own roots via
|
|
88
|
+
`additionalDirectories` in the response).
|
|
89
|
+
|
|
90
|
+
### Session modes — approval mode (standard)
|
|
91
|
+
|
|
92
|
+
Approval mode uses ACP's native session-mode mechanism, not an extension:
|
|
93
|
+
|
|
94
|
+
- `session/new` / `session/load` advertise `modes` (`SessionModeState`):
|
|
95
|
+
available `manual` / `auto` / `bypass` + the current mode.
|
|
96
|
+
- `set_session_mode(mode_id, session_id)` switches it.
|
|
97
|
+
- Changes are pushed as the standard `current_mode_update` (`session/update`).
|
|
98
|
+
|
|
99
|
+
The switch is **per-session**: it updates the live approval middleware and does
|
|
100
|
+
not write the global settings-document default. Persisting a default approval
|
|
101
|
+
mode for future sessions is handled by `session/set_config_option`.
|
|
102
|
+
|
|
103
|
+
### Session models — model switch (standard, per-session)
|
|
104
|
+
|
|
105
|
+
Model selection uses ACP's native model mechanism:
|
|
106
|
+
|
|
107
|
+
- `session/new` / `session/load` advertise `models` (`SessionModelState`):
|
|
108
|
+
available model profiles + the current model id.
|
|
109
|
+
- `set_session_model(model_id, session_id)` switches it.
|
|
110
|
+
|
|
111
|
+
The switch is **per-session**: it swaps `settings.model_profile` in-memory and
|
|
112
|
+
soft-restarts the agent (`SetModelProfile` → `on_set_model_profile`) — **no global
|
|
113
|
+
settings write**. Credentials come from the `ModelProfile` (read by `create_client`),
|
|
114
|
+
not `os.environ`, so two sessions in one process can run different providers
|
|
115
|
+
without colliding. `on_settings_reload` preserves the per-session override.
|
|
116
|
+
Persisting a *default* model for future sessions is a separate concern handled by
|
|
117
|
+
the config surface (`session/set_config_option`).
|
|
118
|
+
|
|
119
|
+
## Extension RPCs (client → backend)
|
|
120
|
+
|
|
121
|
+
All routed through `ext_method`.
|
|
122
|
+
|
|
123
|
+
### Session control
|
|
124
|
+
|
|
125
|
+
| Method | Params | Effect |
|
|
126
|
+
|---|---|---|
|
|
127
|
+
| `session/delete` | `sessionId`, `cwd?` | Delete a saved session scoped to cwd. |
|
|
128
|
+
| `session/inject` | `sessionId`, `text` | Inject a prompt into the active turn. Rejected when no turn is running (use `session/prompt` to start one). |
|
|
129
|
+
| `session/rollback` | `sessionId`, `targetTurn`, `revertChanges?`, `selectedPaths?` | Roll back; replays history + emits `chrys/rollback_result`. Response/notification carry `rolledBackUserText` (first discarded user prompt, for restoring the composer), `exclusions` (`[{path, reason}]`, reason = `RollbackExclusionReason` value like `"unrestorable"` / `"move_poisoned"`) for files the plan dropped, and advisory `warnings` (strings). |
|
|
130
|
+
| `session/switch_agent` | `sessionId`, `agentProfile` | Switch active agent profile in-session. Unknown profile → immediate error; switching to the active profile is a no-op (no 60s wait) whose response still carries the live runtime (model/tools/skills), so it won't blank client state. |
|
|
131
|
+
| `session/set_workspace` | `sessionId`, `primaryCwd` | Change primary workspace cwd. `primaryCwd` is validated strictly (must exist + be a directory, resolved absolutely) like `new`/`load`. Soft-restarts the agent, then pushes `chrys/runtime_update` (skills/MCP/memory/context may change). |
|
|
132
|
+
| `session/skip_sleep` | `sessionId`, `callId` | Finish an active `sleep` tool call early. |
|
|
133
|
+
| `session/set_config_option` | `sessionId`, `key`, `value` | Persist a supported config key to the user settings document + awaited reload, then push `chrys/runtime_update` (global default; see below). `key` accepts the logical name or its legacy `CHRYS_*` spelling; the response carries all three names (`key` echoed, `envKey`, `settingKey`). The session must be active — it is validated *before* the document write, so a failed request never leaves persisted config mutated. |
|
|
134
|
+
|
|
135
|
+
Approval mode and model switching are **not** here — they use standard ACP
|
|
136
|
+
`set_session_mode` / `set_session_model` (see *Standard ACP*).
|
|
137
|
+
|
|
138
|
+
### Read-only queries
|
|
139
|
+
|
|
140
|
+
| Method | Params | Returns |
|
|
141
|
+
|---|---|---|
|
|
142
|
+
| `chrys/session_runtime` | `sessionId` | Runtime snapshot: profile, model, tokens/usage, tools, MCP/skills details. |
|
|
143
|
+
| `session/mutations` | `sessionId` | Per-turn mutation summary + rollback turns + file summary. Mutations carry `beforeSkip`/`afterSkip` (`"too_large"` / `"binary"` / `null`) when a side's content backup was withheld by snapshot policy; such files are excluded from the `files` summary. Each mutation also carries `provenance` (`"proven"` / `"assumed"` / `"foreign"`) + `contested` (bool); `turns[].mutations` and `mutationCount` are the **raw event log** (foreign rows included — clients filter/badge themselves), while the net-level `files` list excludes foreign changes and carries folded `contested`/`inferred` badges. |
|
|
144
|
+
| `session/diff` | `sessionId`, `path?`, `turn?` | Before/after text diff entries (binary-aware). Entries whose content backup was withheld by snapshot policy (oversized/binary files) are omitted. Each entry carries the same folded `contested`/`inferred` badges as the `session/mutations` `files` list, so clients can badge diffs without joining the two endpoints. |
|
|
145
|
+
| `session/history` | `sessionId`, `cwd?` | Raw persisted messages, without the messages compaction excluded (tool calls it summarized or removed, a dropped current turn's in-between text, folded turns). Scoped to the requesting workspace cwd (like `load`/`delete`); a session from another workspace is rejected. An assistant message whose `additional_properties._group` has `_summary_of_group_ids` is compaction's summary of excluded tool calls, kept for the model: the `session/load` and `session/rollback` replays show neither the summary nor the messages it replaced, and a client rendering this list should skip it too. |
|
|
146
|
+
| `settings/options` | `sessionId?` | Supported config keys under all three names (`key`, `envKey`, `settingKey`). Each entry carries the durable document `value` plus `baseValue`/`baseSource` — the manager's base settings, deliberately not called any session's view. With `sessionId`, entries add `sessionValue`/`sessionSource` read from that session's own loaded settings. |
|
|
147
|
+
| `mcp/list` | `sessionId` | MCP tools + failures from runtime details. |
|
|
148
|
+
| `skills/list` | `sessionId` | Skill sources + details from runtime details. |
|
|
149
|
+
|
|
150
|
+
### Sub-agent control
|
|
151
|
+
|
|
152
|
+
| Method | Params | Effect |
|
|
153
|
+
|---|---|---|
|
|
154
|
+
| `sub_agent/retry` | `sessionId`, `invocationId` | Retry a paused sub-agent invocation. |
|
|
155
|
+
| `sub_agent/abort` | `sessionId`, `invocationId` | Abort a paused sub-agent invocation. |
|
|
156
|
+
|
|
157
|
+
### Profiles / config / MCP
|
|
158
|
+
|
|
159
|
+
| Method | Params | Notes |
|
|
160
|
+
|---|---|---|
|
|
161
|
+
| `profiles/agents/list` | — | Agent profile summaries, including a `builtin` flag. |
|
|
162
|
+
| `profiles/agents/read` | `name` | Full agent profile. **MCP `headers`/`env` values masked as `"***"`.** |
|
|
163
|
+
| `profiles/agents/write` | `profile` | Persist. Masked `"***"` MCP secrets restored from the stored profile. |
|
|
164
|
+
| `profiles/agents/delete` | `name` | Delete a user agent profile. Built-in profiles are rejected; clients should migrate the previous "delete shadow to restore built-in" behavior to `profiles/agents/reset`. |
|
|
165
|
+
| `profiles/agents/reset` | `name` | Reset a built-in profile while retaining Skills, MCP, and Memory settings. Returns `changed: false` when no shadow or resettable changes exist. |
|
|
166
|
+
| `profiles/models/list` | — | Model profile summaries (no secrets). |
|
|
167
|
+
| `profiles/models/read` | `id` | Full model profile. **`api_key` masked as `"***"`.** |
|
|
168
|
+
| `profiles/models/write` | `profile` | Persist. `api_key` of `""`/`"***"` preserves the stored key. Omitting `stream` or sending `null` streams for a new profile and keeps the stored value on an update; `false` (or another false spelling such as `0` or `""`) turns streaming off. |
|
|
169
|
+
| `profiles/models/delete` | `id` | Delete a model profile. |
|
|
170
|
+
| `settings/reload` | `sessionId` | Reload registries + soft-restart. Awaits the rebuild: a failed reload returns an error, success pushes `chrys/runtime_update`. |
|
|
171
|
+
| `mcp/test` | `server` | One-shot HTTP MCP connection test. Client-supplied stdio is rejected. |
|
|
172
|
+
|
|
173
|
+
### Backend → client callback
|
|
174
|
+
|
|
175
|
+
`chrys/request_input` carries the whole `ask_user` batch in one request:
|
|
176
|
+
`sessionId`, `requestId`, `callerName`, and `questions`:
|
|
177
|
+
|
|
178
|
+
```json
|
|
179
|
+
{
|
|
180
|
+
"sessionId": "…",
|
|
181
|
+
"requestId": "…",
|
|
182
|
+
"callerName": "Code",
|
|
183
|
+
"questions": [
|
|
184
|
+
{
|
|
185
|
+
"question": "Which library?",
|
|
186
|
+
"header": "Library",
|
|
187
|
+
"multiSelect": false,
|
|
188
|
+
"options": [{"label": "tenacity", "description": "Use the existing dependency."}]
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"question": "Anything else the retry layer must respect?",
|
|
192
|
+
"header": "Constraints",
|
|
193
|
+
"multiSelect": false,
|
|
194
|
+
"options": []
|
|
195
|
+
}
|
|
196
|
+
]
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
A receiver rejects unknown fields, wrong nested types, over-cap payloads, and
|
|
201
|
+
malformed metadata. There is no capability negotiation and no single-question
|
|
202
|
+
projection: every peer speaks this shape.
|
|
203
|
+
|
|
204
|
+
The client returns a fixed-length positional `answers` array:
|
|
205
|
+
|
|
206
|
+
```json
|
|
207
|
+
{
|
|
208
|
+
"answers": [
|
|
209
|
+
{"values": ["tenacity"], "note": "only for the retry layer"},
|
|
210
|
+
{"values": ["Keep the retry layer transport-agnostic."], "note": ""}
|
|
211
|
+
],
|
|
212
|
+
"cancelled": false
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Free text is a value, not a note: a question without options (or one the user
|
|
217
|
+
answered by typing instead of choosing) carries the typed text as the single
|
|
218
|
+
entry of `values`. `note` is only accepted alongside selected option labels, so
|
|
219
|
+
a note-only answer invalidates the whole response. An empty `values` means the
|
|
220
|
+
question was left unanswered; the model sees it as `unanswered: true`.
|
|
221
|
+
|
|
222
|
+
Structured responses are accepted atomically. The answer count must match the
|
|
223
|
+
question count; values must be distinct and non-blank; a non-multi-select
|
|
224
|
+
question accepts at most one value; multiple values must all be offered option
|
|
225
|
+
labels; and a note is valid only with canonical selected options. Every string
|
|
226
|
+
in the request and the response must be valid Unicode (no unpaired surrogate
|
|
227
|
+
escapes), matching what the JSON transport accepts. A malformed `answers`
|
|
228
|
+
array, `cancelled: true`, a response without `answers`, or a failed callback
|
|
229
|
+
all mean no response; the model receives the retryable `ask_user_no_response`
|
|
230
|
+
tool error. There is no fabricated answer-text sentinel.
|
|
231
|
+
|
|
232
|
+
`ask_user` waits for the client reply with **no backend timeout** by default under
|
|
233
|
+
ACP (`chrys acp` sets `ask_user_timeout_seconds=None`), so the client owns the
|
|
234
|
+
interaction lifetime — keep the prompt open until the user answers, or send
|
|
235
|
+
`session/cancel` to abandon the turn. Pass `chrys acp --ask-user-timeout SECONDS`
|
|
236
|
+
to opt into a backend bound instead; on expiry the model receives a "user did not
|
|
237
|
+
respond" result and the question is considered closed. The timeout is a
|
|
238
|
+
per-session `Settings.ask_user_timeout_seconds` value (TUI/CLI default to a bounded
|
|
239
|
+
15 minutes via `CHRYS_ASK_USER_TIMEOUT_SECONDS`). Under ACP this value is *pinned*:
|
|
240
|
+
`settings/reload` keeps the client-owned timeout rather than reverting to the env
|
|
241
|
+
default (TUI/CLI sessions are unpinned, so they pick up an edited
|
|
242
|
+
`CHRYS_ASK_USER_TIMEOUT_SECONDS` on reload).
|
|
243
|
+
|
|
244
|
+
Standard `session/request_permission` callbacks have a separate 10-minute
|
|
245
|
+
server-side liveness bound. `session/cancel`, `session/close`, and
|
|
246
|
+
`session/delete` interrupt the engine first and then release pending input and
|
|
247
|
+
permission callbacks; close and delete additionally stop prompt admission
|
|
248
|
+
before releasing waits, so a prompt already queued on the session is rejected
|
|
249
|
+
rather than started as a fresh turn the teardown would wait behind. Late
|
|
250
|
+
permission replies are ignored, and unrelated sessions remain independently
|
|
251
|
+
promptable while one client callback is pending.
|
|
252
|
+
|
|
253
|
+
## Extension notifications (backend → client)
|
|
254
|
+
|
|
255
|
+
One-way `ext_notification` pushes, bridged from `EventBus`:
|
|
256
|
+
|
|
257
|
+
- Runtime / session: `chrys/runtime_update`, `chrys/session_restored`,
|
|
258
|
+
`chrys/usage_update`, `chrys/profile_switched`, `chrys/workspace_updated`,
|
|
259
|
+
`chrys/approval_reviewed`.
|
|
260
|
+
- Agent load lifecycle: `chrys/agent_load_started`, `chrys/agent_load_progress`,
|
|
261
|
+
`chrys/agent_load_finished`, `chrys/agent_load_failed`.
|
|
262
|
+
- Diagnostics: `chrys/error`, `chrys/warning`, `chrys/context_compressed`,
|
|
263
|
+
`chrys/context_pressure`, `chrys/tool_compacted`,
|
|
264
|
+
`chrys/compaction_started`, `chrys/compaction_finished`.
|
|
265
|
+
- Edits / turns: `chrys/rollback_result`, `chrys/user_inject_result`.
|
|
266
|
+
- Sub-agent lifecycle: `chrys/sub_agent_invocation_start`,
|
|
267
|
+
`chrys/sub_agent_tool_call_start`, `chrys/sub_agent_tool_call_result`,
|
|
268
|
+
`chrys/sub_agent_progress`, `chrys/sub_agent_retry_attempt`,
|
|
269
|
+
`chrys/sub_agent_compaction_started`, `chrys/sub_agent_compaction_finished`,
|
|
270
|
+
`chrys/sub_agent_compaction_committed`,
|
|
271
|
+
`chrys/sub_agent_paused`, `chrys/sub_agent_resumed`,
|
|
272
|
+
`chrys/sub_agent_aborted`, `chrys/sub_agent_cascade_aborted`.
|
|
273
|
+
|
|
274
|
+
Notes:
|
|
275
|
+
- `chrys/runtime_update` always uses the envelope `{ sessionId, runtime: {...} }`
|
|
276
|
+
for every sender (`session/new`/`load`, model switch, settings reload,
|
|
277
|
+
`set_config_option`, `set_workspace`, rollback, `SessionReady`,
|
|
278
|
+
`AgentRuntimeUpdated` — including mid-turn runtime-skill refreshes). The
|
|
279
|
+
`runtime` object may be partial. The
|
|
280
|
+
`chrys/session_runtime` *request* returns that same runtime object flat (a
|
|
281
|
+
separate request/response contract).
|
|
282
|
+
- `chrys/usage_update` is dual-path for parent-agent session-window updates —
|
|
283
|
+
emitted as a notification *and* projected through the standard
|
|
284
|
+
`session/update` bridge. Sub-agent usage updates are extension-only so
|
|
285
|
+
standard ACP clients do not replace the parent session-window gauge with a
|
|
286
|
+
sub-agent window.
|
|
287
|
+
Its extension payload includes `agentProfile` for display and `usageSourceId`
|
|
288
|
+
for identity, so clients can distinguish parent-agent usage from concurrent
|
|
289
|
+
same-profile sub-agent usage.
|
|
290
|
+
- Sub-agent events are dual-path too: each `chrys/sub_agent_*` notification is
|
|
291
|
+
emitted *and* the bridge projects standard `session/update` tool-call progress
|
|
292
|
+
onto the parent sub-agent tool call, so standard-only clients still see progress.
|
|
293
|
+
- `chrys/compaction_finished` and `chrys/sub_agent_compaction_finished`
|
|
294
|
+
payloads include `formatViolation`. It is empty unless a malformed
|
|
295
|
+
LAST_WORDS note was accepted, in which case it carries the bounded,
|
|
296
|
+
single-line violation left when the corrective retry process stops. The
|
|
297
|
+
parent event also carries a successful generated note in `lastWords`;
|
|
298
|
+
sub-agent notes remain private to their invocation.
|
|
299
|
+
- Both `*_compaction_finished` payloads also include `failureReason` — a
|
|
300
|
+
short human-readable cause set on `failed` outcomes tripped by a known
|
|
301
|
+
safety limit (per-turn compaction round limit, side-call spend budget).
|
|
302
|
+
Frontends should show it in place of the duration on the failure state;
|
|
303
|
+
it is empty for ordinary generation failures.
|
|
304
|
+
- `chrys/sub_agent_compaction_committed` (payload `{ sessionId, agentName,
|
|
305
|
+
invocationId, compactionId, phase }`) trails a `finished` `ok` outcome for
|
|
306
|
+
the same `compactionId` once the round is durably applied — spill written,
|
|
307
|
+
note set, messages excluded. A `finished(ok)` round without it was
|
|
308
|
+
abandoned (its spill write failed), so clients that count or persist real
|
|
309
|
+
compactions must key on this notification, not on `finished`. It is
|
|
310
|
+
extension-only: the standard bridge stays silent because the finished
|
|
311
|
+
update already narrated the outcome.
|
|
312
|
+
- Approval-mode changes use the standard `current_mode_update` `session/update`,
|
|
313
|
+
not an extension.
|
|
314
|
+
|
|
315
|
+
## Standard vs. extension
|
|
316
|
+
|
|
317
|
+
Capabilities that map cleanly to ACP semantics use standard methods; the rest are
|
|
318
|
+
extensions because ACP has no equivalent concept.
|
|
319
|
+
|
|
320
|
+
**Standard (already migrated):** approval mode (`set_session_mode` + session
|
|
321
|
+
modes), model switch (`set_session_model` + session models).
|
|
322
|
+
|
|
323
|
+
**Extension by necessity (no ACP concept):** rollback, mutations/diff, sub-agent
|
|
324
|
+
hierarchy + retry/abort, runtime details (tools/MCP/skills introspection), agent
|
|
325
|
+
profile CRUD, `mcp/test`, mid-run injection, agent-load progress, context/tool
|
|
326
|
+
compaction, structured errors/warnings.
|
|
327
|
+
|
|
328
|
+
### Why config options stay an extension
|
|
329
|
+
|
|
330
|
+
ACP has a native config mechanism (`config_options` on `session/new`,
|
|
331
|
+
`set_config_option`, `current_config_option_update`). Chrys deliberately does
|
|
332
|
+
**not** use it for its config keys, because the semantics don't match:
|
|
333
|
+
|
|
334
|
+
- **Scope.** ACP `set_config_option` is *per-session*; Chrys's keys (the
|
|
335
|
+
`AcpConfigOption` descriptors in `_SUPPORTED_CONFIG_OPTIONS`) write the global
|
|
336
|
+
user settings document. A per-session advertisement of a global value would lie
|
|
337
|
+
about scope and bleed across sessions.
|
|
338
|
+
- **Lifecycle.** The settings-document write persists to disk and is shared with
|
|
339
|
+
the TUI and future processes. ACP config options have no "global application
|
|
340
|
+
setting" concept.
|
|
341
|
+
- **Defaults vs. live state.** Keys like `default_agent` / `default_approval_mode`
|
|
342
|
+
are defaults for the *next* session, not live controls for the current one.
|
|
343
|
+
`default_approval_mode=bypass` is downgraded to `auto` by the settings store's
|
|
344
|
+
own `persist` so a later launch never starts in unattended approval.
|
|
345
|
+
- **Type.** ACP config options are `select` / `boolean` only;
|
|
346
|
+
`rollback_snapshots_keep` is an integer and several keys are free identifiers.
|
|
347
|
+
Values are judged by the same coercer that will read them back, *before* the
|
|
348
|
+
document write (a non-integer `rollback_snapshots_keep` is rejected), so an
|
|
349
|
+
unparseable value can't persist and break a later launch/reload.
|
|
350
|
+
|
|
351
|
+
So the config extension is intentionally the home for *global, persisted
|
|
352
|
+
application defaults*.
|
|
353
|
+
|
|
354
|
+
## Security notes
|
|
355
|
+
|
|
356
|
+
- **No config-key injection.** Config values land in the YAML settings document,
|
|
357
|
+
which stores them verbatim — there is no line-oriented format for a newline to
|
|
358
|
+
smuggle a second key into. With the `_SUPPORTED_CONFIG_OPTIONS` allowlist, a
|
|
359
|
+
client cannot write arbitrary settings keys.
|
|
360
|
+
- **Secret masking.** `read_model_profile` masks `api_key`; `read_agent_profile`
|
|
361
|
+
masks MCP `headers`/`env` values. Write paths restore masked sentinels from the
|
|
362
|
+
stored profile so a read → edit → write round-trip never destroys secrets, and
|
|
363
|
+
reject unresolved masked MCP values after server rename/add.
|
|
364
|
+
- **Profile path safety.** Agent profile names and model profile ids accepted over
|
|
365
|
+
ACP must be filename-safe stems, not absolute or relative paths.
|
|
366
|
+
- **No client stdio execution.** `mcp/test` accepts HTTP MCP configs only and keeps
|
|
367
|
+
client-supplied HTTP headers literal; stdio MCP execution remains limited to
|
|
368
|
+
trusted profile configuration.
|
|
369
|
+
|
|
370
|
+
## Gaps vs. the full ACP protocol
|
|
371
|
+
|
|
372
|
+
Standard ACP methods Chrys does **not** implement:
|
|
373
|
+
|
|
374
|
+
- `authenticate` — Chrys advertises `auth=None`.
|
|
375
|
+
- `fork_session` / `resume_session` — defer or implement as standard (not ext).
|
|
376
|
+
- `set_config_option` (standard typed config) — intentionally replaced by the
|
|
377
|
+
global config extension (see *Why config options stay an extension*).
|
|
378
|
+
|
|
379
|
+
Standard client capabilities Chrys does **not** use (server → client):
|
|
380
|
+
|
|
381
|
+
- `read_text_file` / `write_text_file` — editor-mediated file I/O. Chrys writes
|
|
382
|
+
files directly and surfaces changes via `session/diff` + `session/mutations`.
|
|
383
|
+
- Terminal suite (`create_terminal`, `terminal_output`, `release_terminal`,
|
|
384
|
+
`wait_for_terminal_exit`, `kill_terminal`) — no shell/terminal delegation yet.
|
|
385
|
+
|
|
386
|
+
Standard `session/update` variants Chrys does **not** emit:
|
|
387
|
+
`available_commands_update`, `current_config_option_update`.
|
|
388
|
+
|
|
389
|
+
## Remaining feature gaps / TODO
|
|
390
|
+
|
|
391
|
+
Priority: P1 = high-value VS Code UX, P2 = can stay TUI-only for now.
|
|
392
|
+
|
|
393
|
+
- **[P1] Session-level retry/continue.** `UserRetry` / `RetryAttempt` not exposed
|
|
394
|
+
(only sub-agent retry is). Needs a `session/retry` RPC + `chrys/retry_attempt`.
|
|
395
|
+
- **[P1] Approval-judge detail depth.** `chrys/approval_reviewed` carries the final
|
|
396
|
+
decision; pending/intermediate judge metadata is not surfaced.
|
|
397
|
+
- **[P1] Richer CRUD validation.** Profile/MCP write/delete is functional, but
|
|
398
|
+
field-level validation feedback and a config-dir MCP overlay beyond
|
|
399
|
+
session-create are still thin.
|
|
400
|
+
- **[P2] Image attachment compression events**
|
|
401
|
+
(`ImageAttachmentCompressionStarted/Finished`).
|
|
402
|
+
- **[P2] Shell mode / terminal delegation** — use ACP's standard terminal client
|
|
403
|
+
methods rather than a new extension.
|
|
404
|
+
- **[P2] Queryable backend logs** (`session/logs` / `runtime/logs`).
|
|
405
|
+
- **[P2] Session fork/resume** — use standard `fork_session` / `resume_session`.
|
|
406
|
+
- **[P2] Editor file mediation** — adopt standard `read_text_file` /
|
|
407
|
+
`write_text_file` so VS Code can mediate edits (unsaved buffers).
|
|
408
|
+
- **[P2] Session raw/debug read**, gated to local clients.
|
|
409
|
+
- **Out of scope by design:** notifications config, theme, and the Buddy
|
|
410
|
+
surface remain frontend-local cosmetic UX, not shared backend capabilities.
|
|
411
|
+
|
|
412
|
+
### Capability discovery (known limitation)
|
|
413
|
+
|
|
414
|
+
Extension methods are not advertised in `initialize` capabilities or versioned —
|
|
415
|
+
clients must know the `chrys/*` / `session/*` method names by convention; unknown
|
|
416
|
+
methods raise `method_not_found`. A future improvement is to advertise the
|
|
417
|
+
extension surface (and its version) during `initialize`.
|
|
418
|
+
|
|
419
|
+
## Suggested implementation order
|
|
420
|
+
|
|
421
|
+
1. Session-level retry/continue (matches TUI interaction model).
|
|
422
|
+
2. Approval-judge detail surfacing (trust/diagnosis).
|
|
423
|
+
3. CRUD validation + MCP overlay hardening.
|
|
424
|
+
4. Capability discovery during `initialize`.
|
|
425
|
+
5. Lower-priority P2 items as VS Code UX demands.
|