iCode-TUI 0.29.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chrys/__init__.py +16 -0
- chrys/app/__init__.py +3 -0
- chrys/app/acp/__init__.py +3 -0
- chrys/app/acp/bridge.py +664 -0
- chrys/app/acp/content.py +132 -0
- chrys/app/acp/doc/frontend-api.md +425 -0
- chrys/app/acp/history.py +585 -0
- chrys/app/acp/server.py +1796 -0
- chrys/app/acp/session_manager.py +1815 -0
- chrys/app/acp/tool_status.py +45 -0
- chrys/app/cli/__init__.py +3 -0
- chrys/app/cli/acp.py +178 -0
- chrys/app/cli/app.py +165 -0
- chrys/app/cli/approvals.py +101 -0
- chrys/app/cli/headless.py +223 -0
- chrys/app/cli/launch_cwd.py +42 -0
- chrys/app/cli/profiles.py +298 -0
- chrys/app/cli/progress.py +857 -0
- chrys/app/cli/run.py +425 -0
- chrys/app/cli/serve.py +1593 -0
- chrys/app/cli/tool_summary.py +225 -0
- chrys/app/cli/trajectory.py +201 -0
- chrys/app/cli/workflow.py +601 -0
- chrys/app/features/__init__.py +3 -0
- chrys/app/features/buddy/__init__.py +3 -0
- chrys/app/features/buddy/actions.py +68 -0
- chrys/app/features/buddy/animation.py +76 -0
- chrys/app/features/buddy/commands.py +196 -0
- chrys/app/features/buddy/docs/design.md +187 -0
- chrys/app/features/buddy/hatchery.py +80 -0
- chrys/app/features/buddy/lifecycle.py +41 -0
- chrys/app/features/buddy/model.py +265 -0
- chrys/app/features/buddy/pixel_renderer.py +113 -0
- chrys/app/features/buddy/pixel_sprites.py +279 -0
- chrys/app/features/buddy/portrait.py +76 -0
- chrys/app/features/buddy/progression.py +58 -0
- chrys/app/features/buddy/replies.py +191 -0
- chrys/app/features/buddy/sprites/alien.toml +70 -0
- chrys/app/features/buddy/sprites/axolotl.toml +71 -0
- chrys/app/features/buddy/sprites/bat.toml +69 -0
- chrys/app/features/buddy/sprites/bee.toml +69 -0
- chrys/app/features/buddy/sprites/cactus.toml +73 -0
- chrys/app/features/buddy/sprites/capybara.toml +70 -0
- chrys/app/features/buddy/sprites/cat.toml +69 -0
- chrys/app/features/buddy/sprites/crab.toml +70 -0
- chrys/app/features/buddy/sprites/dragon.toml +71 -0
- chrys/app/features/buddy/sprites/duck.toml +69 -0
- chrys/app/features/buddy/sprites/fox.toml +69 -0
- chrys/app/features/buddy/sprites/frog.toml +70 -0
- chrys/app/features/buddy/sprites/ghost.toml +70 -0
- chrys/app/features/buddy/sprites/goose.toml +69 -0
- chrys/app/features/buddy/sprites/jelly.toml +70 -0
- chrys/app/features/buddy/sprites/llama.toml +70 -0
- chrys/app/features/buddy/sprites/mushroom.toml +69 -0
- chrys/app/features/buddy/sprites/octopus.toml +70 -0
- chrys/app/features/buddy/sprites/owl.toml +70 -0
- chrys/app/features/buddy/sprites/panda.toml +71 -0
- chrys/app/features/buddy/sprites/penguin.toml +69 -0
- chrys/app/features/buddy/sprites/rabbit.toml +70 -0
- chrys/app/features/buddy/sprites/robot.toml +72 -0
- chrys/app/features/buddy/sprites/shark.toml +70 -0
- chrys/app/features/buddy/sprites/snail.toml +69 -0
- chrys/app/features/buddy/sprites/snake.toml +69 -0
- chrys/app/features/buddy/sprites/tabby.toml +69 -0
- chrys/app/features/buddy/sprites/turtle.toml +69 -0
- chrys/app/features/buddy/store.py +143 -0
- chrys/app/features/session_title/__init__.py +7 -0
- chrys/app/features/session_title/updater.py +582 -0
- chrys/app/installer.py +651 -0
- chrys/app/parsing.py +17 -0
- chrys/app/tui/__init__.py +3 -0
- chrys/app/tui/app.py +1287 -0
- chrys/app/tui/behaviors/__init__.py +3 -0
- chrys/app/tui/behaviors/click_outside_dismiss.py +90 -0
- chrys/app/tui/behaviors/insert_clipboard.py +73 -0
- chrys/app/tui/behaviors/right_click_copy.py +146 -0
- chrys/app/tui/binding_display.py +139 -0
- chrys/app/tui/buddy_messages.py +17 -0
- chrys/app/tui/buddy_reply.py +86 -0
- chrys/app/tui/chrys.tcss +549 -0
- chrys/app/tui/clipboard.py +109 -0
- chrys/app/tui/copy_messages.py +10 -0
- chrys/app/tui/i18n.py +230 -0
- chrys/app/tui/language.py +58 -0
- chrys/app/tui/notifications/__init__.py +12 -0
- chrys/app/tui/notifications/drivers.py +180 -0
- chrys/app/tui/notifications/service.py +126 -0
- chrys/app/tui/notifications/settings.py +141 -0
- chrys/app/tui/screens/__init__.py +3 -0
- chrys/app/tui/screens/agents/__init__.py +8 -0
- chrys/app/tui/screens/agents/agent_draft_store.py +937 -0
- chrys/app/tui/screens/agents/config.py +2142 -0
- chrys/app/tui/screens/agents/config.tcss +169 -0
- chrys/app/tui/screens/agents/panels/__init__.py +3 -0
- chrys/app/tui/screens/agents/panels/acp.py +1176 -0
- chrys/app/tui/screens/agents/panels/basic.py +497 -0
- chrys/app/tui/screens/agents/panels/compaction.py +231 -0
- chrys/app/tui/screens/agents/panels/config_card.py +218 -0
- chrys/app/tui/screens/agents/panels/instructions.py +91 -0
- chrys/app/tui/screens/agents/panels/markdown_report.py +76 -0
- chrys/app/tui/screens/agents/panels/mcp.py +2262 -0
- chrys/app/tui/screens/agents/panels/memory.py +684 -0
- chrys/app/tui/screens/agents/panels/path_entry.py +227 -0
- chrys/app/tui/screens/agents/panels/skills.py +806 -0
- chrys/app/tui/screens/agents/panels/subagents.py +652 -0
- chrys/app/tui/screens/agents/panels/tools.py +205 -0
- chrys/app/tui/screens/agents/picker.py +103 -0
- chrys/app/tui/screens/agents/skill_paths.py +38 -0
- chrys/app/tui/screens/agents/validation_messages.py +452 -0
- chrys/app/tui/screens/dialogs/__init__.py +35 -0
- chrys/app/tui/screens/dialogs/agent_load.py +834 -0
- chrys/app/tui/screens/dialogs/agent_load.tcss +78 -0
- chrys/app/tui/screens/dialogs/app_mode.py +55 -0
- chrys/app/tui/screens/dialogs/approval/__init__.py +15 -0
- chrys/app/tui/screens/dialogs/approval/approval.tcss +311 -0
- chrys/app/tui/screens/dialogs/approval/bodies/__init__.py +3 -0
- chrys/app/tui/screens/dialogs/approval/bodies/file_edit.py +210 -0
- chrys/app/tui/screens/dialogs/approval/bodies/sub_agent.py +82 -0
- chrys/app/tui/screens/dialogs/approval/body.py +110 -0
- chrys/app/tui/screens/dialogs/approval/dialog.py +565 -0
- chrys/app/tui/screens/dialogs/approval/mode.py +105 -0
- chrys/app/tui/screens/dialogs/ask_user.py +148 -0
- chrys/app/tui/screens/dialogs/ask_user.tcss +62 -0
- chrys/app/tui/screens/dialogs/base.py +84 -0
- chrys/app/tui/screens/dialogs/confirm.py +184 -0
- chrys/app/tui/screens/dialogs/confirm.tcss +46 -0
- chrys/app/tui/screens/dialogs/connection_test.py +183 -0
- chrys/app/tui/screens/dialogs/connection_test.tcss +92 -0
- chrys/app/tui/screens/dialogs/diagram.py +102 -0
- chrys/app/tui/screens/dialogs/diagram.tcss +24 -0
- chrys/app/tui/screens/dialogs/editor.py +378 -0
- chrys/app/tui/screens/dialogs/editor.tcss +132 -0
- chrys/app/tui/screens/dialogs/file_picker.py +582 -0
- chrys/app/tui/screens/dialogs/file_picker.tcss +78 -0
- chrys/app/tui/screens/dialogs/fork_session.py +219 -0
- chrys/app/tui/screens/dialogs/fork_session.tcss +75 -0
- chrys/app/tui/screens/dialogs/image_compression.py +102 -0
- chrys/app/tui/screens/dialogs/image_compression.tcss +28 -0
- chrys/app/tui/screens/dialogs/man_page.py +172 -0
- chrys/app/tui/screens/dialogs/man_page.tcss +39 -0
- chrys/app/tui/screens/dialogs/new_folder.py +277 -0
- chrys/app/tui/screens/dialogs/new_folder.tcss +51 -0
- chrys/app/tui/screens/dialogs/notice.tcss +14 -0
- chrys/app/tui/screens/dialogs/prompt_cache.py +144 -0
- chrys/app/tui/screens/dialogs/prompt_cache.tcss +38 -0
- chrys/app/tui/screens/dialogs/runtime_details.py +371 -0
- chrys/app/tui/screens/dialogs/runtime_details.tcss +49 -0
- chrys/app/tui/screens/dialogs/session_title.py +110 -0
- chrys/app/tui/screens/dialogs/session_title.tcss +43 -0
- chrys/app/tui/screens/dialogs/tool_view.py +207 -0
- chrys/app/tui/screens/dialogs/tool_view.tcss +43 -0
- chrys/app/tui/screens/dialogs/vision_unsupported.py +122 -0
- chrys/app/tui/screens/dialogs/vision_unsupported.tcss +35 -0
- chrys/app/tui/screens/dialogs/workflow_confirm.py +91 -0
- chrys/app/tui/screens/dialogs/workflow_confirm.tcss +17 -0
- chrys/app/tui/screens/dialogs/workflow_input.py +258 -0
- chrys/app/tui/screens/dialogs/workflow_input.tcss +73 -0
- chrys/app/tui/screens/dialogs/workflow_node.py +462 -0
- chrys/app/tui/screens/dialogs/workflow_node.tcss +41 -0
- chrys/app/tui/screens/dialogs/workflow_picker.py +46 -0
- chrys/app/tui/screens/dialogs/workflow_result.py +136 -0
- chrys/app/tui/screens/dialogs/workflow_result.tcss +14 -0
- chrys/app/tui/screens/diff/__init__.py +22 -0
- chrys/app/tui/screens/diff/rollback_modal.py +1381 -0
- chrys/app/tui/screens/diff/rollback_modal.tcss +248 -0
- chrys/app/tui/screens/diff/screen.py +1532 -0
- chrys/app/tui/screens/diff/screen.tcss +104 -0
- chrys/app/tui/screens/guides/__init__.py +7 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/agents.md +178 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/approval.md +117 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/chat-options.md +276 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/compaction.md +42 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/memory.md +48 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/models.md +158 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/settings.md +210 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/themes.md +61 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/tools.md +60 -0
- chrys/app/tui/screens/guides/_docs/en/guides/configuration/web-tools.md +286 -0
- chrys/app/tui/screens/guides/_docs/en/guides/daily-use/sessions.md +77 -0
- chrys/app/tui/screens/guides/_docs/en/guides/daily-use/workspaces.md +51 -0
- chrys/app/tui/screens/guides/_docs/en/guides/extensions/external-acp-agents.md +126 -0
- chrys/app/tui/screens/guides/_docs/en/guides/extensions/hooks.md +167 -0
- chrys/app/tui/screens/guides/_docs/en/guides/extensions/mcp.md +95 -0
- chrys/app/tui/screens/guides/_docs/en/guides/extensions/skills.md +175 -0
- chrys/app/tui/screens/guides/_docs/en/guides/running/icode-acp.md +61 -0
- chrys/app/tui/screens/guides/_docs/en/guides/running/icode-run.md +190 -0
- chrys/app/tui/screens/guides/_docs/en/guides/running/icode-serve.md +239 -0
- chrys/app/tui/screens/guides/_docs/en/guides/running/workflows.md +664 -0
- chrys/app/tui/screens/guides/_docs/en/reference/agent-profile.md +548 -0
- chrys/app/tui/screens/guides/_docs/en/reference/hooks.md +602 -0
- chrys/app/tui/screens/guides/_docs/en/reference/opentelemetry.md +177 -0
- chrys/app/tui/screens/guides/_docs/en/reference/settings.md +245 -0
- chrys/app/tui/screens/guides/_docs/en/reference/themes.md +149 -0
- chrys/app/tui/screens/guides/_docs/en/reference/tool-kinds-and-names.md +58 -0
- chrys/app/tui/screens/guides/_docs/en/reference/tui-slash-commands.md +76 -0
- chrys/app/tui/screens/guides/_docs/en/reference/workflows.md +1006 -0
- chrys/app/tui/screens/guides/_docs/en/start/getting-started.md +170 -0
- chrys/app/tui/screens/guides/_docs/en/start/what-is-icode.md +34 -0
- chrys/app/tui/screens/guides/_docs/index.yaml +100 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/agents.md +178 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/approval.md +117 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/chat-options.md +276 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/compaction.md +42 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/memory.md +48 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/models.md +158 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/settings.md +210 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/themes.md +61 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/tools.md +60 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/web-tools.md +286 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/daily-use/sessions.md +77 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/daily-use/workspaces.md +51 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/extensions/external-acp-agents.md +126 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/extensions/hooks.md +167 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/extensions/mcp.md +95 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/extensions/skills.md +175 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/running/icode-acp.md +61 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/running/icode-run.md +190 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/running/icode-serve.md +239 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/guides/running/workflows.md +664 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/agent-profile.md +548 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/hooks.md +602 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/opentelemetry.md +177 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/settings.md +245 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/themes.md +149 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/tool-kinds-and-names.md +58 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/tui-slash-commands.md +76 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/reference/workflows.md +1005 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/start/getting-started.md +170 -0
- chrys/app/tui/screens/guides/_docs/zh-Hans/start/what-is-icode.md +34 -0
- chrys/app/tui/screens/guides/index.py +215 -0
- chrys/app/tui/screens/guides/reader.py +173 -0
- chrys/app/tui/screens/guides/screen.py +442 -0
- chrys/app/tui/screens/guides/screen.tcss +52 -0
- chrys/app/tui/screens/logs/__init__.py +7 -0
- chrys/app/tui/screens/logs/screen.py +504 -0
- chrys/app/tui/screens/logs/screen.tcss +45 -0
- chrys/app/tui/screens/main/__init__.py +7 -0
- chrys/app/tui/screens/main/action_availability.py +30 -0
- chrys/app/tui/screens/main/buddy_command.py +143 -0
- chrys/app/tui/screens/main/commands.py +1073 -0
- chrys/app/tui/screens/main/config_actions.py +464 -0
- chrys/app/tui/screens/main/copy_actions.py +117 -0
- chrys/app/tui/screens/main/dialog_controllers.py +826 -0
- chrys/app/tui/screens/main/dialog_gateway.py +166 -0
- chrys/app/tui/screens/main/diff_controller.py +478 -0
- chrys/app/tui/screens/main/engine_read_model.py +184 -0
- chrys/app/tui/screens/main/event_handlers.py +2014 -0
- chrys/app/tui/screens/main/input_flow.py +241 -0
- chrys/app/tui/screens/main/live_diff.py +244 -0
- chrys/app/tui/screens/main/main_screen_presenter.py +295 -0
- chrys/app/tui/screens/main/model_indicator.py +217 -0
- chrys/app/tui/screens/main/navigation.py +343 -0
- chrys/app/tui/screens/main/ports.py +571 -0
- chrys/app/tui/screens/main/recent_dirs.py +123 -0
- chrys/app/tui/screens/main/rollback_controller.py +586 -0
- chrys/app/tui/screens/main/runtime_info.py +71 -0
- chrys/app/tui/screens/main/screen.py +2265 -0
- chrys/app/tui/screens/main/screen.tcss +21 -0
- chrys/app/tui/screens/main/session_handlers.py +1127 -0
- chrys/app/tui/screens/main/session_title.py +239 -0
- chrys/app/tui/screens/main/settings_coordinator.py +365 -0
- chrys/app/tui/screens/main/settings_persistence.py +184 -0
- chrys/app/tui/screens/main/shell_mode.py +112 -0
- chrys/app/tui/screens/main/state.py +289 -0
- chrys/app/tui/screens/main/submit_state.py +11 -0
- chrys/app/tui/screens/main/subscriptions.py +177 -0
- chrys/app/tui/screens/main/suggestions.py +982 -0
- chrys/app/tui/screens/main/tool_action_bridge.py +75 -0
- chrys/app/tui/screens/main/view_adapter.py +1567 -0
- chrys/app/tui/screens/main/workflow_browser.py +747 -0
- chrys/app/tui/screens/main/workflow_content.py +248 -0
- chrys/app/tui/screens/main/workflow_controller.py +240 -0
- chrys/app/tui/screens/main/workflow_feedback.py +137 -0
- chrys/app/tui/screens/main/workflow_flow.py +49 -0
- chrys/app/tui/screens/main/workflow_run_control.py +456 -0
- chrys/app/tui/screens/main/workflow_session_view.py +316 -0
- chrys/app/tui/screens/main/workspace_actions.py +272 -0
- chrys/app/tui/screens/main/workspace_branch.py +194 -0
- chrys/app/tui/screens/menus/__init__.py +8 -0
- chrys/app/tui/screens/menus/languages.py +114 -0
- chrys/app/tui/screens/models/__init__.py +7 -0
- chrys/app/tui/screens/models/picker.py +147 -0
- chrys/app/tui/screens/models/screen.py +2043 -0
- chrys/app/tui/screens/models/screen.tcss +255 -0
- chrys/app/tui/screens/sessions/__init__.py +8 -0
- chrys/app/tui/screens/sessions/presenter.py +586 -0
- chrys/app/tui/screens/sessions/screen.py +779 -0
- chrys/app/tui/screens/sessions/screen.tcss +127 -0
- chrys/app/tui/screens/settings/__init__.py +29 -0
- chrys/app/tui/screens/settings/danger.py +26 -0
- chrys/app/tui/screens/settings/dialog.py +281 -0
- chrys/app/tui/screens/settings/layout.py +519 -0
- chrys/app/tui/screens/settings/migrate_dialog.py +253 -0
- chrys/app/tui/screens/settings/panes/__init__.py +3 -0
- chrys/app/tui/screens/settings/panes/notifications.py +248 -0
- chrys/app/tui/screens/settings/panes/sessions.py +148 -0
- chrys/app/tui/screens/settings/ports.py +55 -0
- chrys/app/tui/screens/settings/provenance.py +102 -0
- chrys/app/tui/screens/settings/rows.py +546 -0
- chrys/app/tui/screens/settings/settings.tcss +406 -0
- chrys/app/tui/screens/themes/__init__.py +8 -0
- chrys/app/tui/screens/themes/dialogs.py +330 -0
- chrys/app/tui/screens/themes/editor.py +632 -0
- chrys/app/tui/screens/themes/editor.tcss +268 -0
- chrys/app/tui/screens/themes/messages.py +95 -0
- chrys/app/tui/screens/themes/palette.py +694 -0
- chrys/app/tui/screens/themes/panel.py +113 -0
- chrys/app/tui/screens/themes/picker.py +203 -0
- chrys/app/tui/screens/themes/save.py +191 -0
- chrys/app/tui/support/__init__.py +3 -0
- chrys/app/tui/support/file_manager.py +64 -0
- chrys/app/tui/support/gc_freeze.py +1114 -0
- chrys/app/tui/support/path_shortcuts.py +50 -0
- chrys/app/tui/support/prompt_history.py +298 -0
- chrys/app/tui/support/workspace_mru.py +476 -0
- chrys/app/tui/terminal/__init__.py +6 -0
- chrys/app/tui/terminal/_pty_backend.py +114 -0
- chrys/app/tui/terminal/emulator/__init__.py +24 -0
- chrys/app/tui/terminal/emulator/buffer.py +456 -0
- chrys/app/tui/terminal/emulator/charsets.py +113 -0
- chrys/app/tui/terminal/emulator/core.py +963 -0
- chrys/app/tui/terminal/emulator/input.py +342 -0
- chrys/app/tui/terminal/emulator/parser.py +227 -0
- chrys/app/tui/terminal/emulator/pen.py +158 -0
- chrys/app/tui/terminal/launcher.py +455 -0
- chrys/app/tui/terminal/leaked_reports.py +44 -0
- chrys/app/tui/terminal/panel.py +323 -0
- chrys/app/tui/terminal/pty_process.py +405 -0
- chrys/app/tui/terminal/rendering.py +151 -0
- chrys/app/tui/terminal/shell.py +273 -0
- chrys/app/tui/terminal/shell_integration.py +199 -0
- chrys/app/tui/terminal/title.py +224 -0
- chrys/app/tui/terminal/widget.py +654 -0
- chrys/app/tui/theme.py +422 -0
- chrys/app/tui/theme_loader.py +201 -0
- chrys/app/tui/theme_stylesheet.py +49 -0
- chrys/app/tui/themes/__init__.py +3 -0
- chrys/app/tui/themes/document.py +120 -0
- chrys/app/tui/themes/preview.py +170 -0
- chrys/app/tui/themes/store.py +176 -0
- chrys/app/tui/toasts.py +69 -0
- chrys/app/tui/util/__init__.py +3 -0
- chrys/app/tui/util/context_pressure.py +146 -0
- chrys/app/tui/util/debug_log.py +292 -0
- chrys/app/tui/util/diff_entries.py +64 -0
- chrys/app/tui/util/formatting.py +53 -0
- chrys/app/tui/util/git_branch.py +326 -0
- chrys/app/tui/util/invocation_progress.py +57 -0
- chrys/app/tui/util/logo.py +32 -0
- chrys/app/tui/util/message_gate.py +35 -0
- chrys/app/tui/util/mutation_sources.py +14 -0
- chrys/app/tui/util/picker_text.py +27 -0
- chrys/app/tui/util/removal.py +47 -0
- chrys/app/tui/util/rich_style.py +36 -0
- chrys/app/tui/util/source_text.py +12 -0
- chrys/app/tui/util/static_update.py +88 -0
- chrys/app/tui/util/todo_format.py +51 -0
- chrys/app/tui/util/visibility.py +214 -0
- chrys/app/tui/widgets/__init__.py +60 -0
- chrys/app/tui/widgets/ask_user_controls.py +652 -0
- chrys/app/tui/widgets/ask_user_markdown.py +17 -0
- chrys/app/tui/widgets/ask_user_prompt.py +606 -0
- chrys/app/tui/widgets/buttons.py +52 -0
- chrys/app/tui/widgets/chat/__init__.py +3 -0
- chrys/app/tui/widgets/chat/agent_transcript_surface.py +818 -0
- chrys/app/tui/widgets/chat/chrome.py +296 -0
- chrys/app/tui/widgets/chat/compaction_card.py +353 -0
- chrys/app/tui/widgets/chat/context_fold.py +77 -0
- chrys/app/tui/widgets/chat/file_snapshot.py +91 -0
- chrys/app/tui/widgets/chat/image_preview.py +214 -0
- chrys/app/tui/widgets/chat/live_renderer.py +383 -0
- chrys/app/tui/widgets/chat/messages.py +1039 -0
- chrys/app/tui/widgets/chat/panel.py +1769 -0
- chrys/app/tui/widgets/chat/ports.py +245 -0
- chrys/app/tui/widgets/chat/renderers/__init__.py +7 -0
- chrys/app/tui/widgets/chat/renderers/ask_user.py +747 -0
- chrys/app/tui/widgets/chat/renderers/execute.py +431 -0
- chrys/app/tui/widgets/chat/renderers/file_edit.py +925 -0
- chrys/app/tui/widgets/chat/renderers/hosted_code.py +83 -0
- chrys/app/tui/widgets/chat/renderers/hosted_generic.py +330 -0
- chrys/app/tui/widgets/chat/renderers/hosted_image.py +107 -0
- chrys/app/tui/widgets/chat/renderers/hosted_mcp.py +43 -0
- chrys/app/tui/widgets/chat/renderers/hosted_search.py +167 -0
- chrys/app/tui/widgets/chat/renderers/hosted_shell.py +132 -0
- chrys/app/tui/widgets/chat/renderers/read_file.py +399 -0
- chrys/app/tui/widgets/chat/renderers/search.py +348 -0
- chrys/app/tui/widgets/chat/renderers/skill.py +564 -0
- chrys/app/tui/widgets/chat/renderers/sleep.py +287 -0
- chrys/app/tui/widgets/chat/renderers/sub_agent.py +1385 -0
- chrys/app/tui/widgets/chat/renderers/todo.py +114 -0
- chrys/app/tui/widgets/chat/renderers/web.py +69 -0
- chrys/app/tui/widgets/chat/replay.py +1605 -0
- chrys/app/tui/widgets/chat/replay_mount.py +322 -0
- chrys/app/tui/widgets/chat/scroll_controller.py +579 -0
- chrys/app/tui/widgets/chat/selection_controller.py +435 -0
- chrys/app/tui/widgets/chat/session_json.py +508 -0
- chrys/app/tui/widgets/chat/toc_model.py +156 -0
- chrys/app/tui/widgets/chat/tool_call.py +2478 -0
- chrys/app/tui/widgets/chat/tool_registry.py +753 -0
- chrys/app/tui/widgets/chat/tool_renderers.py +247 -0
- chrys/app/tui/widgets/chat/tool_view_builders.py +260 -0
- chrys/app/tui/widgets/chat/transcript_reader.py +57 -0
- chrys/app/tui/widgets/checkbox.py +24 -0
- chrys/app/tui/widgets/chrome/__init__.py +3 -0
- chrys/app/tui/widgets/chrome/app_header.py +283 -0
- chrys/app/tui/widgets/chrome/commands.py +95 -0
- chrys/app/tui/widgets/chrome/file_index.py +68 -0
- chrys/app/tui/widgets/chrome/file_scanner.py +670 -0
- chrys/app/tui/widgets/chrome/footer.py +284 -0
- chrys/app/tui/widgets/chrome/image_paste.py +351 -0
- chrys/app/tui/widgets/chrome/input_bar.py +1299 -0
- chrys/app/tui/widgets/chrome/status_bar.py +911 -0
- chrys/app/tui/widgets/chrome/suggestion_list.py +652 -0
- chrys/app/tui/widgets/click_affordance.py +24 -0
- chrys/app/tui/widgets/color_picker/__init__.py +254 -0
- chrys/app/tui/widgets/color_picker/controls.py +171 -0
- chrys/app/tui/widgets/color_picker/model.py +89 -0
- chrys/app/tui/widgets/dialog_buttons.py +58 -0
- chrys/app/tui/widgets/dialog_scroll.py +24 -0
- chrys/app/tui/widgets/diff_view/__init__.py +20 -0
- chrys/app/tui/widgets/diff_view/cells.py +59 -0
- chrys/app/tui/widgets/diff_view/code.py +280 -0
- chrys/app/tui/widgets/diff_view/compute.py +286 -0
- chrys/app/tui/widgets/diff_view/gutter.py +161 -0
- chrys/app/tui/widgets/diff_view/inline.py +77 -0
- chrys/app/tui/widgets/diff_view/palette.py +87 -0
- chrys/app/tui/widgets/diff_view/protocols.py +24 -0
- chrys/app/tui/widgets/diff_view/rows.py +138 -0
- chrys/app/tui/widgets/diff_view/unified.py +267 -0
- chrys/app/tui/widgets/diff_view/widget.py +209 -0
- chrys/app/tui/widgets/editor/__init__.py +79 -0
- chrys/app/tui/widgets/editor/coordinates.py +30 -0
- chrys/app/tui/widgets/editor/highlighter.py +139 -0
- chrys/app/tui/widgets/editor/keymaps.py +357 -0
- chrys/app/tui/widgets/editor/types.py +216 -0
- chrys/app/tui/widgets/editor/vim.py +1195 -0
- chrys/app/tui/widgets/editor/widget.py +401 -0
- chrys/app/tui/widgets/file_preview.py +58 -0
- chrys/app/tui/widgets/hatch.py +138 -0
- chrys/app/tui/widgets/input.py +66 -0
- chrys/app/tui/widgets/loading.py +125 -0
- chrys/app/tui/widgets/markdown/__init__.py +25 -0
- chrys/app/tui/widgets/markdown/_utils.py +21 -0
- chrys/app/tui/widgets/markdown/anchors.py +71 -0
- chrys/app/tui/widgets/markdown/blocks.py +115 -0
- chrys/app/tui/widgets/markdown/copyable.py +163 -0
- chrys/app/tui/widgets/markdown/diagram/__init__.py +35 -0
- chrys/app/tui/widgets/markdown/diagram/canvas.py +409 -0
- chrys/app/tui/widgets/markdown/diagram/charts.py +52 -0
- chrys/app/tui/widgets/markdown/diagram/diagnostics.py +101 -0
- chrys/app/tui/widgets/markdown/diagram/geometry.py +46 -0
- chrys/app/tui/widgets/markdown/diagram/layout.py +494 -0
- chrys/app/tui/widgets/markdown/diagram/messages.py +18 -0
- chrys/app/tui/widgets/markdown/diagram/model.py +275 -0
- chrys/app/tui/widgets/markdown/diagram/parser.py +173 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/__init__.py +3 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/charts.py +349 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/common.py +403 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/graphs.py +1072 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/planning.py +317 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/schedule.py +298 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/schemas.py +241 -0
- chrys/app/tui/widgets/markdown/diagram/parsers/structure.py +221 -0
- chrys/app/tui/widgets/markdown/diagram/presentation.py +32 -0
- chrys/app/tui/widgets/markdown/diagram/renderers/__init__.py +3 -0
- chrys/app/tui/widgets/markdown/diagram/renderers/charts.py +275 -0
- chrys/app/tui/widgets/markdown/diagram/renderers/common.py +73 -0
- chrys/app/tui/widgets/markdown/diagram/renderers/planning.py +157 -0
- chrys/app/tui/widgets/markdown/diagram/renderers/schedule.py +202 -0
- chrys/app/tui/widgets/markdown/diagram/renderers/structure.py +77 -0
- chrys/app/tui/widgets/markdown/diagram/renderers/xy.py +385 -0
- chrys/app/tui/widgets/markdown/diagram/router.py +651 -0
- chrys/app/tui/widgets/markdown/diagram/specs/__init__.py +3 -0
- chrys/app/tui/widgets/markdown/diagram/specs/charts.py +94 -0
- chrys/app/tui/widgets/markdown/diagram/specs/planning.py +68 -0
- chrys/app/tui/widgets/markdown/diagram/specs/schedule.py +65 -0
- chrys/app/tui/widgets/markdown/diagram/specs/structure.py +23 -0
- chrys/app/tui/widgets/markdown/diagram/viewer.py +92 -0
- chrys/app/tui/widgets/markdown/links.py +47 -0
- chrys/app/tui/widgets/markdown/math/__init__.py +36 -0
- chrys/app/tui/widgets/markdown/math/layout.py +739 -0
- chrys/app/tui/widgets/markdown/math/markdown.py +291 -0
- chrys/app/tui/widgets/markdown/math/parser.py +325 -0
- chrys/app/tui/widgets/markdown/math/symbols.py +325 -0
- chrys/app/tui/widgets/markdown/navigator.py +80 -0
- chrys/app/tui/widgets/markdown/parser.py +1057 -0
- chrys/app/tui/widgets/markdown/stream.py +73 -0
- chrys/app/tui/widgets/markdown/toc.py +98 -0
- chrys/app/tui/widgets/markdown/viewer.py +146 -0
- chrys/app/tui/widgets/markdown/widget.py +2046 -0
- chrys/app/tui/widgets/marquee.py +101 -0
- chrys/app/tui/widgets/option_menu.py +82 -0
- chrys/app/tui/widgets/page_navigator.py +118 -0
- chrys/app/tui/widgets/select.py +196 -0
- chrys/app/tui/widgets/selection.py +59 -0
- chrys/app/tui/widgets/sidebar/__init__.py +3 -0
- chrys/app/tui/widgets/sidebar/buddy.py +367 -0
- chrys/app/tui/widgets/sidebar/context.py +482 -0
- chrys/app/tui/widgets/sidebar/debug.py +195 -0
- chrys/app/tui/widgets/sidebar/empty_state.py +11 -0
- chrys/app/tui/widgets/sidebar/panel.py +198 -0
- chrys/app/tui/widgets/sidebar/tasks.py +198 -0
- chrys/app/tui/widgets/sidebar/toc.py +166 -0
- chrys/app/tui/widgets/sidebar/toc_types.py +30 -0
- chrys/app/tui/widgets/syntax_theme.py +85 -0
- chrys/app/tui/widgets/text_area.py +258 -0
- chrys/app/tui/widgets/trajectory/__init__.py +8 -0
- chrys/app/tui/widgets/trajectory/chartkit.py +264 -0
- chrys/app/tui/widgets/trajectory/insights.py +1266 -0
- chrys/app/tui/widgets/trajectory/overview.py +1101 -0
- chrys/app/tui/widgets/trajectory/panel.py +983 -0
- chrys/app/tui/widgets/trajectory/presentation.py +311 -0
- chrys/app/tui/widgets/trajectory/session_info.py +124 -0
- chrys/app/tui/widgets/trajectory/text_view.py +124 -0
- chrys/app/tui/widgets/trajectory/timeline.py +380 -0
- chrys/app/tui/widgets/welcome.py +126 -0
- chrys/app/tui/widgets/workflow/__init__.py +5 -0
- chrys/app/tui/widgets/workflow/edges.py +89 -0
- chrys/app/tui/widgets/workflow/graph.py +869 -0
- chrys/app/tui/widgets/workflow/info.py +310 -0
- chrys/app/tui/widgets/workflow/node_view.py +27 -0
- chrys/app/tui/widgets/workflow/output.py +225 -0
- chrys/app/tui/widgets/workflow/panel.py +658 -0
- chrys/app/tui/widgets/workflow/projector.py +324 -0
- chrys/app/tui/widgets/workflow/records.py +69 -0
- chrys/app/tui/widgets/workflow/scrollbar.py +82 -0
- chrys/app/tui/widgets/workflow/selection.py +151 -0
- chrys/app/tui/widgets/workflow/source.py +65 -0
- chrys/app/tui/widgets/workflow/text.py +257 -0
- chrys/app/tui/widgets/workflow/values.py +317 -0
- chrys/foundation/__init__.py +0 -0
- chrys/foundation/branding.py +15 -0
- chrys/foundation/config/__init__.py +7 -0
- chrys/foundation/config/coercion.py +374 -0
- chrys/foundation/config/context.py +34 -0
- chrys/foundation/config/env_file.py +141 -0
- chrys/foundation/config/env_layers.py +370 -0
- chrys/foundation/config/migrations.py +521 -0
- chrys/foundation/config/notification_events.py +22 -0
- chrys/foundation/config/process_settings.py +332 -0
- chrys/foundation/config/runtime_pointer.py +133 -0
- chrys/foundation/config/settings.py +1952 -0
- chrys/foundation/config/settings_store.py +996 -0
- chrys/foundation/config/spec.py +396 -0
- chrys/foundation/config/user_settings.py +140 -0
- chrys/foundation/config/warnings.py +262 -0
- chrys/foundation/config/web_values.py +135 -0
- chrys/foundation/config/yaml_store.py +487 -0
- chrys/foundation/errors/__init__.py +68 -0
- chrys/foundation/errors/_legacy.py +117 -0
- chrys/foundation/errors/_text.py +13 -0
- chrys/foundation/errors/_walk.py +85 -0
- chrys/foundation/errors/classify.py +278 -0
- chrys/foundation/errors/display.py +274 -0
- chrys/foundation/errors/formatting.py +283 -0
- chrys/foundation/errors/kinds.py +67 -0
- chrys/foundation/errors/network.py +497 -0
- chrys/foundation/errors/provider.py +445 -0
- chrys/foundation/errors/route.py +85 -0
- chrys/foundation/events/__init__.py +8 -0
- chrys/foundation/events/bus.py +143 -0
- chrys/foundation/events/types.py +1629 -0
- chrys/foundation/events/workflow.py +38 -0
- chrys/foundation/hosted_tools.py +142 -0
- chrys/foundation/i18n/__init__.py +32 -0
- chrys/foundation/i18n/_catalogs/zh-Hans/LC_MESSAGES/chrys.mo +0 -0
- chrys/foundation/i18n/catalogs.py +42 -0
- chrys/foundation/i18n/formatting.py +202 -0
- chrys/foundation/i18n/locale.py +92 -0
- chrys/foundation/i18n/localizer.py +187 -0
- chrys/foundation/i18n/messages.py +268 -0
- chrys/foundation/io/__init__.py +3 -0
- chrys/foundation/io/result_content.py +237 -0
- chrys/foundation/models/__init__.py +3 -0
- chrys/foundation/models/approval_reuse.py +23 -0
- chrys/foundation/models/ask_user.py +468 -0
- chrys/foundation/models/execution.py +18 -0
- chrys/foundation/models/history_markers.py +115 -0
- chrys/foundation/models/invocations.py +63 -0
- chrys/foundation/models/mutation_scope.py +28 -0
- chrys/foundation/models/session_env.py +87 -0
- chrys/foundation/models/session_surface.py +29 -0
- chrys/foundation/models/todos.py +74 -0
- chrys/foundation/models/turns.py +125 -0
- chrys/foundation/models/workflow_session.py +89 -0
- chrys/foundation/models/workspace.py +59 -0
- chrys/foundation/net/__init__.py +3 -0
- chrys/foundation/net/address_class.py +57 -0
- chrys/foundation/net/route_probe.py +94 -0
- chrys/foundation/net/url.py +107 -0
- chrys/foundation/observability/__init__.py +3 -0
- chrys/foundation/observability/exporters.py +174 -0
- chrys/foundation/observability/gate.py +31 -0
- chrys/foundation/observability/setup.py +497 -0
- chrys/foundation/observability/sink.py +228 -0
- chrys/foundation/patches/__init__.py +19 -0
- chrys/foundation/patches/mdurl_cache.py +59 -0
- chrys/foundation/patches/patcher.py +287 -0
- chrys/foundation/patches/staged_members.py +205 -0
- chrys/foundation/patches/textual_block_border.py +105 -0
- chrys/foundation/patches/textual_button_ansi.py +65 -0
- chrys/foundation/patches/textual_button_ansi_old.txt +68 -0
- chrys/foundation/patches/textual_callback_cache.py +248 -0
- chrys/foundation/patches/textual_callback_dispatch.py +109 -0
- chrys/foundation/patches/textual_compositor_cjk.py +566 -0
- chrys/foundation/patches/textual_dispatch_cache.py +150 -0
- chrys/foundation/patches/textual_ime_cursor_anchor.py +92 -0
- chrys/foundation/patches/textual_kitty_keyboard.py +268 -0
- chrys/foundation/patches/textual_lru_acyclic.py +241 -0
- chrys/foundation/patches/textual_message_pump.py +136 -0
- chrys/foundation/patches/textual_node_diet.py +875 -0
- chrys/foundation/patches/textual_one_shot_timer.py +48 -0
- chrys/foundation/patches/textual_option_list.py +90 -0
- chrys/foundation/patches/textual_precompose.py +89 -0
- chrys/foundation/patches/textual_pruned_tabs.py +69 -0
- chrys/foundation/patches/textual_reflow_reuse.py +1753 -0
- chrys/foundation/patches/textual_removed_node_caches.py +86 -0
- chrys/foundation/patches/textual_removed_screen_callbacks.py +55 -0
- chrys/foundation/patches/textual_selection_extract.py +48 -0
- chrys/foundation/patches/textual_strip_cycles.py +119 -0
- chrys/foundation/patches/textual_tab_selection.py +1611 -0
- chrys/foundation/patches/textual_timer_skip.py +70 -0
- chrys/foundation/patches/textual_utf8_decoder.py +106 -0
- chrys/foundation/patches/textual_win_sleep.py +167 -0
- chrys/foundation/patches/watchdog_fsevents.py +70 -0
- chrys/foundation/patches/watchdog_windows.py +52 -0
- chrys/foundation/platform/__init__.py +556 -0
- chrys/foundation/platform/c_api.py +32 -0
- chrys/foundation/platform/child_reap.py +107 -0
- chrys/foundation/platform/command_line.py +95 -0
- chrys/foundation/platform/files.py +1470 -0
- chrys/foundation/platform/output_capture.py +113 -0
- chrys/foundation/platform/paths.py +193 -0
- chrys/foundation/platform/process.py +1468 -0
- chrys/foundation/platform/pty_output.py +19 -0
- chrys/foundation/platform/runtime_paths.py +281 -0
- chrys/foundation/platform/win_console.py +129 -0
- chrys/foundation/reasoning_origin.py +67 -0
- chrys/foundation/recovery.py +16 -0
- chrys/foundation/retry.py +278 -0
- chrys/foundation/text/__init__.py +3 -0
- chrys/foundation/text/encoding.py +603 -0
- chrys/foundation/text/images.py +304 -0
- chrys/foundation/text/lines.py +24 -0
- chrys/foundation/text/mentions.py +90 -0
- chrys/foundation/text/model_json.py +25 -0
- chrys/foundation/text/reading_order.py +20 -0
- chrys/foundation/text/tokenizer.py +25 -0
- chrys/foundation/text/tool_output.py +287 -0
- chrys/foundation/text/yaml_io.py +62 -0
- chrys/foundation/tool_call_context.py +202 -0
- chrys/foundation/tool_execution_stamp.py +184 -0
- chrys/foundation/tool_invocation_order.py +48 -0
- chrys/foundation/tool_kinds.py +102 -0
- chrys/foundation/tool_result_metadata.py +287 -0
- chrys/foundation/trajectory/__init__.py +10 -0
- chrys/foundation/trajectory/context.py +481 -0
- chrys/foundation/trajectory/envelope.py +571 -0
- chrys/foundation/trajectory/event_types.py +294 -0
- chrys/foundation/trajectory/finalizers.py +46 -0
- chrys/foundation/trajectory/fingerprint.py +62 -0
- chrys/foundation/trajectory/ids.py +155 -0
- chrys/foundation/trajectory/keys.py +99 -0
- chrys/foundation/trajectory/lease.py +173 -0
- chrys/foundation/trajectory/metadata.py +72 -0
- chrys/foundation/trajectory/reader.py +271 -0
- chrys/foundation/trajectory/recovery.py +225 -0
- chrys/foundation/trajectory/revisions.py +152 -0
- chrys/foundation/trajectory/segments.py +225 -0
- chrys/foundation/trajectory/tools.py +117 -0
- chrys/foundation/trajectory/usage.py +151 -0
- chrys/foundation/trajectory/writer.py +972 -0
- chrys/foundation/trajectory_timing.py +97 -0
- chrys/foundation/util/__init__.py +3 -0
- chrys/foundation/util/async_tasks.py +29 -0
- chrys/foundation/util/chrys_headers.py +23 -0
- chrys/foundation/util/env_templates.py +104 -0
- chrys/foundation/util/filenames.py +96 -0
- chrys/foundation/util/header_charset.py +138 -0
- chrys/foundation/util/httpx_helpers.py +12 -0
- chrys/foundation/util/lock.py +236 -0
- chrys/foundation/util/once_close.py +46 -0
- chrys/foundation/util/session_ids.py +29 -0
- chrys/foundation/util/shell_tokens.py +88 -0
- chrys/foundation/util/sub_agent_context.py +38 -0
- chrys/foundation/util/time.py +35 -0
- chrys/foundation/util/unicode_scalars.py +36 -0
- chrys/foundation/vendor/__init__.py +43 -0
- chrys/foundation/vendor/ripgrep/rg-aarch64-apple-darwin +0 -0
- chrys/foundation/vendor/ripgrep/rg-aarch64-pc-windows-msvc.exe +0 -0
- chrys/foundation/vendor/ripgrep/rg-aarch64-unknown-linux-gnu +0 -0
- chrys/foundation/vendor/ripgrep/rg-x86_64-apple-darwin +0 -0
- chrys/foundation/vendor/ripgrep/rg-x86_64-pc-windows-msvc.exe +0 -0
- chrys/foundation/vendor/ripgrep/rg-x86_64-unknown-linux-musl +0 -0
- chrys/kernel/__init__.py +256 -0
- chrys/kernel/_content.py +1866 -0
- chrys/kernel/_loop_recorder.py +631 -0
- chrys/kernel/_null_overlay.py +1026 -0
- chrys/kernel/_result_ceiling.py +216 -0
- chrys/kernel/_serialization.py +431 -0
- chrys/kernel/_tool_arg_errors.py +1629 -0
- chrys/kernel/_tool_execution.py +1172 -0
- chrys/kernel/_tool_expansion.py +26 -0
- chrys/kernel/_types.py +2598 -0
- chrys/kernel/agent.py +994 -0
- chrys/kernel/client.py +1084 -0
- chrys/kernel/compaction.py +1315 -0
- chrys/kernel/exceptions.py +211 -0
- chrys/kernel/exchanges.py +683 -0
- chrys/kernel/identity.py +95 -0
- chrys/kernel/images.py +36 -0
- chrys/kernel/instrumentation.py +1618 -0
- chrys/kernel/loop.py +2308 -0
- chrys/kernel/middleware.py +616 -0
- chrys/kernel/sessions.py +604 -0
- chrys/kernel/tools.py +1061 -0
- chrys/kernel/types.py +126 -0
- chrys/orchestration/__init__.py +3 -0
- chrys/orchestration/engine/__init__.py +3 -0
- chrys/orchestration/engine/assembly.py +236 -0
- chrys/orchestration/engine/build/__init__.py +3 -0
- chrys/orchestration/engine/build/builder.py +1061 -0
- chrys/orchestration/engine/build/construction.py +408 -0
- chrys/orchestration/engine/build/loaded.py +139 -0
- chrys/orchestration/engine/engine.py +789 -0
- chrys/orchestration/engine/execution.py +771 -0
- chrys/orchestration/engine/loader.py +865 -0
- chrys/orchestration/engine/rollback.py +918 -0
- chrys/orchestration/engine/run/__init__.py +3 -0
- chrys/orchestration/engine/run/active_injection.py +419 -0
- chrys/orchestration/engine/run/attachments.py +519 -0
- chrys/orchestration/engine/run/bindings.py +1095 -0
- chrys/orchestration/engine/run/coordinator.py +1062 -0
- chrys/orchestration/engine/run/finalizer.py +417 -0
- chrys/orchestration/engine/run/input_refs.py +60 -0
- chrys/orchestration/engine/run/prompt_content.py +457 -0
- chrys/orchestration/engine/run/resume.py +299 -0
- chrys/orchestration/engine/run/retry.py +948 -0
- chrys/orchestration/engine/run/runner.py +625 -0
- chrys/orchestration/engine/run/runtime_skills.py +146 -0
- chrys/orchestration/engine/run/sub_agent_coordination.py +126 -0
- chrys/orchestration/engine/run/turn_hooks.py +258 -0
- chrys/orchestration/engine/run/turn_state.py +149 -0
- chrys/orchestration/engine/run/working_dir.py +50 -0
- chrys/orchestration/engine/session_lifecycle.py +2013 -0
- chrys/orchestration/engine/state/__init__.py +3 -0
- chrys/orchestration/engine/state/active_session.py +183 -0
- chrys/orchestration/engine/state/controls.py +639 -0
- chrys/orchestration/engine/state/current_agent.py +26 -0
- chrys/orchestration/engine/state/lifecycle_permits.py +395 -0
- chrys/orchestration/engine/state/machine.py +193 -0
- chrys/orchestration/engine/state/session_writer.py +434 -0
- chrys/orchestration/engine/trajectory.py +714 -0
- chrys/orchestration/engine/usage.py +118 -0
- chrys/orchestration/invoker/__init__.py +3 -0
- chrys/orchestration/invoker/acp.py +727 -0
- chrys/orchestration/invoker/acp_protocol.py +1115 -0
- chrys/orchestration/invoker/acp_spec.py +79 -0
- chrys/orchestration/invoker/attempts.py +994 -0
- chrys/orchestration/invoker/child_compaction.py +131 -0
- chrys/orchestration/invoker/child_history.py +99 -0
- chrys/orchestration/invoker/contracts.py +253 -0
- chrys/orchestration/invoker/evidence.py +94 -0
- chrys/orchestration/invoker/kernel.py +343 -0
- chrys/orchestration/invoker/origin.py +79 -0
- chrys/orchestration/invoker/resources.py +343 -0
- chrys/orchestration/invoker/runtime.py +299 -0
- chrys/orchestration/invoker/usage.py +80 -0
- chrys/orchestration/session_hooks.py +117 -0
- chrys/orchestration/session_host.py +1023 -0
- chrys/orchestration/session_resources.py +95 -0
- chrys/orchestration/session_usage.py +219 -0
- chrys/orchestration/startup.py +255 -0
- chrys/orchestration/sub_agents/__init__.py +3 -0
- chrys/orchestration/sub_agents/acp_policy.py +269 -0
- chrys/orchestration/sub_agents/kernel_policy.py +848 -0
- chrys/orchestration/sub_agents/registration.py +44 -0
- chrys/orchestration/sub_agents/shell.py +337 -0
- chrys/orchestration/sub_agents/tools.py +2228 -0
- chrys/orchestration/workflows/__init__.py +3 -0
- chrys/orchestration/workflows/agent_archive.py +156 -0
- chrys/orchestration/workflows/agent_node.py +894 -0
- chrys/orchestration/workflows/agent_node_build.py +687 -0
- chrys/orchestration/workflows/catalog.py +332 -0
- chrys/orchestration/workflows/coordinator.py +771 -0
- chrys/orchestration/workflows/hooks.py +176 -0
- chrys/orchestration/workflows/preview.py +322 -0
- chrys/orchestration/workflows/rollback.py +151 -0
- chrys/orchestration/workflows/runner.py +986 -0
- chrys/orchestration/workflows/session.py +390 -0
- chrys/orchestration/workflows/settings.py +97 -0
- chrys/orchestration/workflows/validation.py +674 -0
- chrys/orchestration/workflows/worker_client.py +1002 -0
- chrys/service/__init__.py +3 -0
- chrys/service/acp_client/__init__.py +65 -0
- chrys/service/acp_client/_transport.py +922 -0
- chrys/service/acp_client/client.py +1311 -0
- chrys/service/acp_client/errors.py +224 -0
- chrys/service/acp_client/protocol.py +220 -0
- chrys/service/acp_client/spawn.py +239 -0
- chrys/service/acp_client/spec.py +100 -0
- chrys/service/agent_middleware/__init__.py +60 -0
- chrys/service/agent_middleware/_metadata_keys.py +52 -0
- chrys/service/agent_middleware/control/__init__.py +3 -0
- chrys/service/agent_middleware/control/approval.py +769 -0
- chrys/service/agent_middleware/control/approval_hooks.py +62 -0
- chrys/service/agent_middleware/control/ask_user.py +207 -0
- chrys/service/agent_middleware/control/interrupt.py +50 -0
- chrys/service/agent_middleware/control/sleep.py +118 -0
- chrys/service/agent_middleware/control/todo.py +117 -0
- chrys/service/agent_middleware/events/__init__.py +3 -0
- chrys/service/agent_middleware/events/hook_dispatch.py +250 -0
- chrys/service/agent_middleware/events/hosted_tools.py +1762 -0
- chrys/service/agent_middleware/events/intermediate_text.py +128 -0
- chrys/service/agent_middleware/events/rejection_metadata.py +50 -0
- chrys/service/agent_middleware/events/result_persistence.py +98 -0
- chrys/service/agent_middleware/events/sub_agent_events.py +951 -0
- chrys/service/agent_middleware/events/tool_error_text.py +22 -0
- chrys/service/agent_middleware/events/tool_events.py +779 -0
- chrys/service/agent_middleware/injection.py +510 -0
- chrys/service/agent_middleware/reminders/__init__.py +91 -0
- chrys/service/agent_middleware/reminders/archive_pointer.py +154 -0
- chrys/service/agent_middleware/reminders/base.py +25 -0
- chrys/service/agent_middleware/reminders/context_usage.py +74 -0
- chrys/service/agent_middleware/reminders/file_change.py +63 -0
- chrys/service/agent_middleware/reminders/mcp.py +39 -0
- chrys/service/agent_middleware/reminders/profile_switch.py +106 -0
- chrys/service/agent_middleware/reminders/runtime_env.py +190 -0
- chrys/service/agent_middleware/reminders/skills.py +44 -0
- chrys/service/agent_middleware/reminders/sub_agents.py +35 -0
- chrys/service/agent_middleware/reminders/todo.py +35 -0
- chrys/service/agent_middleware/reminders/turn_line.py +48 -0
- chrys/service/agent_middleware/response_validation.py +1380 -0
- chrys/service/agent_middleware/system_reminder.py +1107 -0
- chrys/service/agent_middleware/validators.py +396 -0
- chrys/service/analytics/__init__.py +124 -0
- chrys/service/analytics/_actions.py +896 -0
- chrys/service/analytics/_context_evidence.py +357 -0
- chrys/service/analytics/_critical_path.py +179 -0
- chrys/service/analytics/_facts.py +919 -0
- chrys/service/analytics/_insights.py +769 -0
- chrys/service/analytics/_metric_ops.py +83 -0
- chrys/service/analytics/_session_projection.py +460 -0
- chrys/service/analytics/_timeline.py +434 -0
- chrys/service/analytics/_turn_graph.py +1237 -0
- chrys/service/analytics/_turns.py +1377 -0
- chrys/service/analytics/_workflows.py +171 -0
- chrys/service/analytics/aggregation.py +1474 -0
- chrys/service/analytics/classification.py +128 -0
- chrys/service/analytics/export.py +803 -0
- chrys/service/analytics/findings.py +282 -0
- chrys/service/analytics/math.py +79 -0
- chrys/service/analytics/model.py +886 -0
- chrys/service/analytics/reader.py +321 -0
- chrys/service/approval/__init__.py +3 -0
- chrys/service/approval/arbitration.py +102 -0
- chrys/service/approval/command_identity.py +109 -0
- chrys/service/approval/correlation.py +57 -0
- chrys/service/approval/grant_store.py +108 -0
- chrys/service/approval/judge.py +589 -0
- chrys/service/approval/level.py +15 -0
- chrys/service/approval/policy.py +209 -0
- chrys/service/approval/reuse.py +223 -0
- chrys/service/approval/reuse_binding.py +133 -0
- chrys/service/approval/safety_classifier.py +536 -0
- chrys/service/approval/turn_context.py +49 -0
- chrys/service/context/__init__.py +3 -0
- chrys/service/context/compaction/__init__.py +38 -0
- chrys/service/context/compaction/breaker.py +156 -0
- chrys/service/context/compaction/budgets.py +93 -0
- chrys/service/context/compaction/calibration.py +77 -0
- chrys/service/context/compaction/compression.py +690 -0
- chrys/service/context/compaction/current_turn_drop.py +458 -0
- chrys/service/context/compaction/events.py +201 -0
- chrys/service/context/compaction/exclusions.py +261 -0
- chrys/service/context/compaction/groups.py +361 -0
- chrys/service/context/compaction/last_words.py +1996 -0
- chrys/service/context/compaction/last_words_state.py +752 -0
- chrys/service/context/compaction/scoped.py +472 -0
- chrys/service/context/compaction/spill.py +1947 -0
- chrys/service/context/compaction/strategy.py +1116 -0
- chrys/service/context/compaction/summaries.py +319 -0
- chrys/service/context/compaction/turns.py +375 -0
- chrys/service/context/manager.py +174 -0
- chrys/service/context/memory_loader.py +792 -0
- chrys/service/context/middleware/__init__.py +3 -0
- chrys/service/context/middleware/usage.py +332 -0
- chrys/service/context/providers/__init__.py +3 -0
- chrys/service/context/providers/context_management.py +432 -0
- chrys/service/context/providers/history.py +647 -0
- chrys/service/context/providers/memory.py +50 -0
- chrys/service/context/tool_content.py +22 -0
- chrys/service/hooks/__init__.py +37 -0
- chrys/service/hooks/detached_worker.py +118 -0
- chrys/service/hooks/docs/README.md +14 -0
- chrys/service/hooks/docs/authoring.md +684 -0
- chrys/service/hooks/docs/configuration.md +499 -0
- chrys/service/hooks/docs/design.md +359 -0
- chrys/service/hooks/docs/project-hooks.md +348 -0
- chrys/service/hooks/events.py +157 -0
- chrys/service/hooks/loader.py +665 -0
- chrys/service/hooks/manager.py +807 -0
- chrys/service/hooks/matcher.py +111 -0
- chrys/service/hooks/outbox.py +294 -0
- chrys/service/hooks/runner.py +572 -0
- chrys/service/hooks/schema.py +407 -0
- chrys/service/llm/__init__.py +7 -0
- chrys/service/llm/_structured_outputs.py +192 -0
- chrys/service/llm/anthropic_messages/__init__.py +9 -0
- chrys/service/llm/anthropic_messages/client.py +254 -0
- chrys/service/llm/anthropic_messages/decode.py +331 -0
- chrys/service/llm/anthropic_messages/history.py +279 -0
- chrys/service/llm/anthropic_messages/request.py +323 -0
- chrys/service/llm/anthropic_messages/server_tools.py +319 -0
- chrys/service/llm/anthropic_messages/stream.py +297 -0
- chrys/service/llm/anthropic_messages/thinking_binding.py +156 -0
- chrys/service/llm/chat_completions/__init__.py +9 -0
- chrys/service/llm/chat_completions/client.py +369 -0
- chrys/service/llm/chat_completions/decode.py +338 -0
- chrys/service/llm/chat_completions/history.py +657 -0
- chrys/service/llm/chat_completions/reasoning.py +244 -0
- chrys/service/llm/chat_completions/request.py +192 -0
- chrys/service/llm/chat_completions/stream.py +546 -0
- chrys/service/llm/chat_completions/validation.py +308 -0
- chrys/service/llm/clients.py +613 -0
- chrys/service/llm/images.py +65 -0
- chrys/service/llm/mock.py +413 -0
- chrys/service/llm/observer.py +446 -0
- chrys/service/llm/one_shot.py +106 -0
- chrys/service/llm/openai_exceptions.py +93 -0
- chrys/service/llm/openai_responses/__init__.py +10 -0
- chrys/service/llm/openai_responses/client.py +323 -0
- chrys/service/llm/openai_responses/decode.py +432 -0
- chrys/service/llm/openai_responses/history.py +519 -0
- chrys/service/llm/openai_responses/hosted.py +625 -0
- chrys/service/llm/openai_responses/replay.py +629 -0
- chrys/service/llm/openai_responses/request.py +342 -0
- chrys/service/llm/openai_responses/stream.py +847 -0
- chrys/service/llm/openai_timestamps.py +57 -0
- chrys/service/llm/providers.py +107 -0
- chrys/service/llm/proxy_route.py +54 -0
- chrys/service/llm/raw_http_log.py +309 -0
- chrys/service/llm/route_facts.py +63 -0
- chrys/service/llm/route_sessions.py +49 -0
- chrys/service/llm/sdk_anthropic.py +18 -0
- chrys/service/llm/sdk_headers.py +47 -0
- chrys/service/llm/sdk_openai.py +18 -0
- chrys/service/llm/sdk_retry.py +59 -0
- chrys/service/llm/wire_client.py +246 -0
- chrys/service/mcp/__init__.py +3 -0
- chrys/service/mcp/_connection.py +235 -0
- chrys/service/mcp/_http_transport.py +350 -0
- chrys/service/mcp/_progressive.py +459 -0
- chrys/service/mcp/_stdio_transport.py +614 -0
- chrys/service/mcp/_tool_mixins.py +96 -0
- chrys/service/mcp/adapter.py +1031 -0
- chrys/service/mcp/cache.py +476 -0
- chrys/service/mcp/content.py +32 -0
- chrys/service/mcp/errors.py +169 -0
- chrys/service/mcp/owned.py +1330 -0
- chrys/service/mcp/result_limits.py +168 -0
- chrys/service/mcp/thinking_warning.py +95 -0
- chrys/service/mcp/validation.py +74 -0
- chrys/service/mutations/__init__.py +84 -0
- chrys/service/mutations/coordination.py +894 -0
- chrys/service/mutations/detector.py +458 -0
- chrys/service/mutations/git_calibrator.py +397 -0
- chrys/service/mutations/git_state.py +647 -0
- chrys/service/mutations/pipeline.py +779 -0
- chrys/service/mutations/scanner.py +466 -0
- chrys/service/mutations/snapshot_files.py +233 -0
- chrys/service/mutations/store.py +625 -0
- chrys/service/mutations/tool_names.py +15 -0
- chrys/service/mutations/trace.py +246 -0
- chrys/service/mutations/tracker.py +1289 -0
- chrys/service/mutations/types.py +559 -0
- chrys/service/mutations/workspace_changes.py +1583 -0
- chrys/service/profiles/__init__.py +2 -0
- chrys/service/profiles/agents/__init__.py +3 -0
- chrys/service/profiles/agents/builtins/Code.yaml +199 -0
- chrys/service/profiles/agents/builtins/Explore.yaml +62 -0
- chrys/service/profiles/agents/builtins/General.yaml +114 -0
- chrys/service/profiles/agents/builtins/QA.yaml +128 -0
- chrys/service/profiles/agents/loader.py +808 -0
- chrys/service/profiles/agents/registry.py +727 -0
- chrys/service/profiles/agents/schema.py +371 -0
- chrys/service/profiles/agents/serializer.py +196 -0
- chrys/service/profiles/coercion.py +22 -0
- chrys/service/profiles/models/__init__.py +3 -0
- chrys/service/profiles/models/env_bridge.py +157 -0
- chrys/service/profiles/models/loader.py +282 -0
- chrys/service/profiles/models/options.py +438 -0
- chrys/service/profiles/models/registry.py +104 -0
- chrys/service/profiles/models/resolver.py +286 -0
- chrys/service/profiles/models/schema.py +91 -0
- chrys/service/profiles/models/serializer.py +76 -0
- chrys/service/session/__init__.py +3 -0
- chrys/service/session/checkpoint.py +156 -0
- chrys/service/session/history.py +1616 -0
- chrys/service/session/message_metadata.py +151 -0
- chrys/service/session/persistence.py +435 -0
- chrys/service/session/runtime_metadata.py +210 -0
- chrys/service/session/sub_agent_logs.py +1069 -0
- chrys/service/session/sub_agent_transcript.py +654 -0
- chrys/service/skills/__init__.py +3 -0
- chrys/service/skills/adapter.py +408 -0
- chrys/service/skills/constants.py +8 -0
- chrys/service/skills/loader.py +575 -0
- chrys/service/skills/model.py +130 -0
- chrys/service/skills/provider.py +841 -0
- chrys/service/skills/runner.py +390 -0
- chrys/service/state/__init__.py +3 -0
- chrys/service/state/_fork.py +710 -0
- chrys/service/state/_session_files.py +175 -0
- chrys/service/state/_session_meta.py +552 -0
- chrys/service/state/locks.py +154 -0
- chrys/service/state/serializers.py +156 -0
- chrys/service/state/session_catalog.py +361 -0
- chrys/service/state/session_listing.py +84 -0
- chrys/service/state/session_migration.py +446 -0
- chrys/service/state/session_mru.py +315 -0
- chrys/service/state/store.py +2132 -0
- chrys/service/state/workflow.py +158 -0
- chrys/service/text_blocks.py +47 -0
- chrys/service/todos/__init__.py +3 -0
- chrys/service/todos/reminder.py +31 -0
- chrys/service/todos/tracker.py +58 -0
- chrys/service/tools/__init__.py +3 -0
- chrys/service/tools/approval_targets.py +92 -0
- chrys/service/tools/builtins/__init__.py +3 -0
- chrys/service/tools/builtins/ask_user.py +326 -0
- chrys/service/tools/builtins/doc_converter/__init__.py +494 -0
- chrys/service/tools/builtins/doc_converter/artifacts.py +392 -0
- chrys/service/tools/builtins/doc_converter/parsers/__init__.py +3 -0
- chrys/service/tools/builtins/doc_converter/parsers/_table.py +34 -0
- chrys/service/tools/builtins/doc_converter/parsers/base.py +101 -0
- chrys/service/tools/builtins/doc_converter/parsers/docx.py +88 -0
- chrys/service/tools/builtins/doc_converter/parsers/pdf.py +144 -0
- chrys/service/tools/builtins/doc_converter/parsers/pptx.py +103 -0
- chrys/service/tools/builtins/doc_converter/parsers/xls.py +32 -0
- chrys/service/tools/builtins/doc_converter/parsers/xlsx.py +51 -0
- chrys/service/tools/builtins/doc_converter/registry.py +55 -0
- chrys/service/tools/builtins/filesystem.py +1071 -0
- chrys/service/tools/builtins/search.py +1265 -0
- chrys/service/tools/builtins/shell.py +967 -0
- chrys/service/tools/builtins/shell_command_filtering/__init__.py +5 -0
- chrys/service/tools/builtins/shell_command_filtering/policy.py +60 -0
- chrys/service/tools/builtins/shell_command_filtering/presets.py +152 -0
- chrys/service/tools/builtins/shell_command_filtering/readonly/__init__.py +358 -0
- chrys/service/tools/builtins/shell_command_filtering/readonly/commands.py +416 -0
- chrys/service/tools/builtins/shell_command_filtering/readonly/git.py +408 -0
- chrys/service/tools/builtins/shell_command_filtering/readonly/syntax.py +87 -0
- chrys/service/tools/builtins/shell_command_filtering/tokenizer.py +214 -0
- chrys/service/tools/builtins/shell_filter.py +24 -0
- chrys/service/tools/builtins/sleep.py +91 -0
- chrys/service/tools/builtins/todo.py +64 -0
- chrys/service/tools/builtins/web/__init__.py +6 -0
- chrys/service/tools/builtins/web/build.py +268 -0
- chrys/service/tools/builtins/web/config.py +338 -0
- chrys/service/tools/builtins/web/credentials.py +37 -0
- chrys/service/tools/builtins/web/fetch/__init__.py +3 -0
- chrys/service/tools/builtins/web/fetch/cache.py +68 -0
- chrys/service/tools/builtins/web/fetch/convert.py +56 -0
- chrys/service/tools/builtins/web/fetch/tool.py +223 -0
- chrys/service/tools/builtins/web/hosted.py +61 -0
- chrys/service/tools/builtins/web/http.py +330 -0
- chrys/service/tools/builtins/web/progress.py +18 -0
- chrys/service/tools/builtins/web/search/__init__.py +3 -0
- chrys/service/tools/builtins/web/search/exa_mcp.py +146 -0
- chrys/service/tools/builtins/web/search/html.py +152 -0
- chrys/service/tools/builtins/web/search/json_api.py +227 -0
- chrys/service/tools/builtins/web/search/providers.py +77 -0
- chrys/service/tools/builtins/web/search/tool.py +218 -0
- chrys/service/tools/builtins/web/search/types.py +28 -0
- chrys/service/tools/builtins/web/tls_identity.py +66 -0
- chrys/service/tools/kinds.py +115 -0
- chrys/service/tools/names.py +47 -0
- chrys/service/tools/registry.py +242 -0
- chrys/service/tools/result_metadata.py +103 -0
- chrys/service/tools/session_artifacts.py +196 -0
- chrys/service/tools/spill.py +218 -0
- chrys/service/tools/workspace_paths.py +81 -0
- chrys/service/trajectory/__init__.py +11 -0
- chrys/service/trajectory/approvals.py +201 -0
- chrys/service/trajectory/compaction.py +420 -0
- chrys/service/trajectory/fork.py +75 -0
- chrys/service/trajectory/hooks.py +217 -0
- chrys/service/trajectory/items.py +41 -0
- chrys/service/trajectory/preparation.py +374 -0
- chrys/service/trajectory/retries.py +95 -0
- chrys/service/trajectory/revisions.py +129 -0
- chrys/service/trajectory/segmented.py +163 -0
- chrys/service/trajectory/session.py +762 -0
- chrys/service/trajectory/state.py +83 -0
- chrys/service/trajectory/sub_agents.py +169 -0
- chrys/service/trajectory/tombstone.py +262 -0
- chrys/service/trajectory/tools.py +323 -0
- chrys/service/trajectory/validation.py +130 -0
- chrys/service/trajectory/waits.py +161 -0
- chrys/service/trajectory/workflow.py +148 -0
- chrys/service/vision.py +128 -0
- chrys/service/workflows/__init__.py +3 -0
- chrys/service/workflows/admission.py +151 -0
- chrys/service/workflows/artifacts.py +109 -0
- chrys/service/workflows/asks.py +130 -0
- chrys/service/workflows/builtins/__init__.py +12 -0
- chrys/service/workflows/builtins/demo-workflow.manifest.json +635 -0
- chrys/service/workflows/builtins/demo-workflow.py +756 -0
- chrys/service/workflows/discovery.py +554 -0
- chrys/service/workflows/environment.py +284 -0
- chrys/service/workflows/graph.py +430 -0
- chrys/service/workflows/history.py +82 -0
- chrys/service/workflows/interpreter.py +107 -0
- chrys/service/workflows/journal.py +334 -0
- chrys/service/workflows/layout.py +56 -0
- chrys/service/workflows/ledger.py +149 -0
- chrys/service/workflows/model_selection.py +18 -0
- chrys/service/workflows/orphans.py +209 -0
- chrys/service/workflows/outcomes.py +46 -0
- chrys/service/workflows/protocol.py +210 -0
- chrys/service/workflows/records.py +142 -0
- chrys/service/workflows/scheduler.py +770 -0
- chrys/service/workflows/sdk/__init__.py +51 -0
- chrys/service/workflows/sdk/_ask.py +167 -0
- chrys/service/workflows/sdk/_builder.py +781 -0
- chrys/service/workflows/sdk/_values.py +92 -0
- chrys/service/workflows/sdk_artifact.py +74 -0
- chrys/service/workflows/store.py +494 -0
- chrys/service/workflows/transcript.py +102 -0
- chrys/service/workflows/values.py +73 -0
- chrys/service/workflows/worker_host.py +1820 -0
- chrys/workflows.py +38 -0
- icode_tui-0.29.1.dist-info/METADATA +104 -0
- icode_tui-0.29.1.dist-info/RECORD +1138 -0
- icode_tui-0.29.1.dist-info/WHEEL +4 -0
- icode_tui-0.29.1.dist-info/entry_points.txt +2 -0
- icode_tui-0.29.1.dist-info/licenses/LICENSE +202 -0
- icode_tui-0.29.1.dist-info/licenses/NOTICE +1955 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Compact, persistent metadata for one completed tool invocation."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import hashlib
|
|
8
|
+
import json
|
|
9
|
+
import logging
|
|
10
|
+
from collections.abc import Mapping, MutableMapping
|
|
11
|
+
from dataclasses import asdict, is_dataclass
|
|
12
|
+
from datetime import date, datetime
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any, Literal
|
|
15
|
+
|
|
16
|
+
from pydantic import BaseModel
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
EXECUTION_STAMP_KEY = "_exec_stamp"
|
|
21
|
+
"""Per-result ``additional_properties`` key for effective invocation metadata."""
|
|
22
|
+
|
|
23
|
+
EFFECTIVE_ARGS_MAX_CHARS = 2_048
|
|
24
|
+
"""Maximum stored canonical argument characters; longer values are middle-truncated."""
|
|
25
|
+
|
|
26
|
+
EXECUTION_STAMP_DIGEST_HEX_CHARS = 16
|
|
27
|
+
"""Number of leading SHA-256 hex characters stored for the full argument payload."""
|
|
28
|
+
|
|
29
|
+
ExecutionOutcome = Literal["ok", "error"]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def write_execution_stamp(
|
|
33
|
+
metadata: MutableMapping[str, Any],
|
|
34
|
+
arguments: Any,
|
|
35
|
+
*,
|
|
36
|
+
outcome: ExecutionOutcome,
|
|
37
|
+
error_kind: str | None = None,
|
|
38
|
+
) -> None:
|
|
39
|
+
"""Write the canonical execution stamp for one completed invocation."""
|
|
40
|
+
try:
|
|
41
|
+
stamp = build_execution_stamp(
|
|
42
|
+
arguments,
|
|
43
|
+
outcome=outcome,
|
|
44
|
+
error_kind=error_kind,
|
|
45
|
+
)
|
|
46
|
+
except Exception:
|
|
47
|
+
# Execution stamps are observability/durability metadata. A custom
|
|
48
|
+
# typed argument that cannot be represented must never turn an
|
|
49
|
+
# otherwise successful tool invocation into a tool failure.
|
|
50
|
+
logger.debug("Failed to serialize tool execution stamp", exc_info=True)
|
|
51
|
+
return
|
|
52
|
+
metadata[EXECUTION_STAMP_KEY] = stamp
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def build_execution_stamp(
|
|
56
|
+
arguments: Any,
|
|
57
|
+
*,
|
|
58
|
+
outcome: ExecutionOutcome,
|
|
59
|
+
error_kind: str | None = None,
|
|
60
|
+
) -> dict[str, str]:
|
|
61
|
+
"""Return a compact stamp whose digest covers the uncapped canonical arguments."""
|
|
62
|
+
serialized = canonicalize_effective_arguments(arguments)
|
|
63
|
+
stamp = {
|
|
64
|
+
"effective_args_digest": hashlib.sha256(serialized.encode("utf-8", errors="surrogatepass")).hexdigest()[
|
|
65
|
+
:EXECUTION_STAMP_DIGEST_HEX_CHARS
|
|
66
|
+
],
|
|
67
|
+
"effective_args": _middle_truncate(serialized, EFFECTIVE_ARGS_MAX_CHARS),
|
|
68
|
+
"outcome": outcome,
|
|
69
|
+
}
|
|
70
|
+
if error_kind:
|
|
71
|
+
stamp["error_kind"] = error_kind
|
|
72
|
+
return stamp
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def canonicalize_effective_arguments(arguments: Any) -> str:
|
|
76
|
+
"""Serialize JSON-like effective arguments deterministically and compactly."""
|
|
77
|
+
payload = arguments.model_dump(mode="json") if isinstance(arguments, BaseModel) else arguments
|
|
78
|
+
return json.dumps(
|
|
79
|
+
_normalize_json_containers(payload),
|
|
80
|
+
ensure_ascii=False,
|
|
81
|
+
sort_keys=True,
|
|
82
|
+
separators=(",", ":"),
|
|
83
|
+
default=_json_default,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _normalize_json_containers(value: Any) -> Any:
|
|
88
|
+
"""Normalize typed container shapes before deterministic JSON encoding.
|
|
89
|
+
|
|
90
|
+
Pydantic validation can turn JSON object keys into typed Python values
|
|
91
|
+
such as :class:`date`. ``json.dumps(default=...)`` never applies its
|
|
92
|
+
default handler to mapping keys, so normalize those keys explicitly.
|
|
93
|
+
If normalization would collapse distinct keys, preserve the mapping as
|
|
94
|
+
sorted key/value pairs instead of dropping data.
|
|
95
|
+
"""
|
|
96
|
+
if isinstance(value, BaseModel):
|
|
97
|
+
return _normalize_json_containers(value.model_dump(mode="json"))
|
|
98
|
+
if is_dataclass(value) and not isinstance(value, type):
|
|
99
|
+
return _normalize_json_containers(asdict(value))
|
|
100
|
+
if isinstance(value, Mapping):
|
|
101
|
+
normalized_items = [
|
|
102
|
+
(_canonical_mapping_key(key), _normalize_json_containers(nested)) for key, nested in value.items()
|
|
103
|
+
]
|
|
104
|
+
keys = [key for key, _nested in normalized_items]
|
|
105
|
+
if len(keys) == len(set(keys)):
|
|
106
|
+
return dict(normalized_items)
|
|
107
|
+
items = [[_normalize_json_containers(key), _normalize_json_containers(nested)] for key, nested in value.items()]
|
|
108
|
+
items.sort(key=_canonical_sort_key)
|
|
109
|
+
return {"__mapping_items__": items}
|
|
110
|
+
if isinstance(value, list | tuple):
|
|
111
|
+
return [_normalize_json_containers(item) for item in value]
|
|
112
|
+
if isinstance(value, set | frozenset):
|
|
113
|
+
items = [_normalize_json_containers(item) for item in value]
|
|
114
|
+
items.sort(key=_canonical_sort_key)
|
|
115
|
+
return items
|
|
116
|
+
return value
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _canonical_mapping_key(value: Any) -> str:
|
|
120
|
+
"""Render one Python mapping key as its stable JSON-object key."""
|
|
121
|
+
if isinstance(value, str):
|
|
122
|
+
return value
|
|
123
|
+
if value is None:
|
|
124
|
+
return "null"
|
|
125
|
+
if isinstance(value, bool):
|
|
126
|
+
return "true" if value else "false"
|
|
127
|
+
if isinstance(value, int | float):
|
|
128
|
+
return json.dumps(value, ensure_ascii=False)
|
|
129
|
+
converted = _json_default(value)
|
|
130
|
+
if isinstance(converted, str):
|
|
131
|
+
return converted
|
|
132
|
+
return _canonical_sort_key(_normalize_json_containers(converted))
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def _canonical_sort_key(value: Any) -> str:
|
|
136
|
+
"""Return a deterministic ordering key for normalized container values."""
|
|
137
|
+
return json.dumps(value, ensure_ascii=False, sort_keys=True, separators=(",", ":"), default=_json_default)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def execution_stamp_from_metadata(metadata: Mapping[str, Any]) -> dict[str, str] | None:
|
|
141
|
+
"""Return a validated shallow copy of a stored execution stamp."""
|
|
142
|
+
value = metadata.get(EXECUTION_STAMP_KEY)
|
|
143
|
+
if not isinstance(value, Mapping):
|
|
144
|
+
return None
|
|
145
|
+
digest = value.get("effective_args_digest")
|
|
146
|
+
arguments = value.get("effective_args")
|
|
147
|
+
outcome = value.get("outcome")
|
|
148
|
+
if not isinstance(digest, str) or not isinstance(arguments, str) or outcome not in {"ok", "error"}:
|
|
149
|
+
return None
|
|
150
|
+
stamp = {
|
|
151
|
+
"effective_args_digest": digest,
|
|
152
|
+
"effective_args": arguments,
|
|
153
|
+
"outcome": outcome,
|
|
154
|
+
}
|
|
155
|
+
error_kind = value.get("error_kind")
|
|
156
|
+
if isinstance(error_kind, str) and error_kind:
|
|
157
|
+
stamp["error_kind"] = error_kind
|
|
158
|
+
return stamp
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def _middle_truncate(value: str, max_chars: int) -> str:
|
|
162
|
+
if len(value) <= max_chars:
|
|
163
|
+
return value
|
|
164
|
+
marker = "…"
|
|
165
|
+
available = max_chars - len(marker)
|
|
166
|
+
left = (available + 1) // 2
|
|
167
|
+
right = available - left
|
|
168
|
+
return f"{value[:left]}{marker}{value[len(value) - right :]}"
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def _json_default(value: Any) -> Any:
|
|
172
|
+
if isinstance(value, BaseModel):
|
|
173
|
+
return value.model_dump(mode="json")
|
|
174
|
+
if is_dataclass(value) and not isinstance(value, type):
|
|
175
|
+
return asdict(value)
|
|
176
|
+
if isinstance(value, bytes):
|
|
177
|
+
return value.decode("utf-8", errors="replace")
|
|
178
|
+
if isinstance(value, (date, datetime)):
|
|
179
|
+
return value.isoformat()
|
|
180
|
+
if isinstance(value, Path):
|
|
181
|
+
return str(value)
|
|
182
|
+
if isinstance(value, (set, frozenset)):
|
|
183
|
+
return sorted(value, key=repr)
|
|
184
|
+
return str(value)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Single-producer tool invocation ordinal.
|
|
4
|
+
|
|
5
|
+
The kernel tool loop is the sole authoritative producer: it stamps every
|
|
6
|
+
non-informational ``function_call`` content of a run attempt with a 0-based
|
|
7
|
+
ordinal in model emission order, at response arrival — before the dispatch
|
|
8
|
+
filter, tool lookup, and argument validation. Calls that never reach the
|
|
9
|
+
middleware pipeline (invalid arguments, unknown tools, duplicate ids, no-tools
|
|
10
|
+
batches) still consume ordinals, so persisted numbering and pipeline numbering
|
|
11
|
+
can never diverge.
|
|
12
|
+
|
|
13
|
+
The same key carries the ordinal in two mappings with one meaning:
|
|
14
|
+
|
|
15
|
+
- ``Content.additional_properties`` on the assistant ``function_call``
|
|
16
|
+
(persisted to session.json; consumers such as approval-decision
|
|
17
|
+
persistence read it back instead of counting positions), and
|
|
18
|
+
- ``FunctionInvocationContext.metadata`` (runtime carriage; event/approval
|
|
19
|
+
middleware read it via their existing accessors).
|
|
20
|
+
|
|
21
|
+
Consumers must treat a missing stamp as "never order-match" (fail closed),
|
|
22
|
+
not as "count for yourself".
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
from collections.abc import Mapping
|
|
28
|
+
from typing import Final
|
|
29
|
+
|
|
30
|
+
TOOL_INVOCATION_ORDER_KEY: Final[str] = "_chrys_tool_invocation_order"
|
|
31
|
+
"""Current-run tool invocation ordinal (see module docstring)."""
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def read_tool_invocation_order(mapping: object) -> int | None:
|
|
35
|
+
"""Return the stamped invocation ordinal from a metadata mapping, if any."""
|
|
36
|
+
if not isinstance(mapping, Mapping):
|
|
37
|
+
return None
|
|
38
|
+
raw = mapping.get(TOOL_INVOCATION_ORDER_KEY)
|
|
39
|
+
if isinstance(raw, bool):
|
|
40
|
+
return None
|
|
41
|
+
if isinstance(raw, int):
|
|
42
|
+
return raw
|
|
43
|
+
if isinstance(raw, str):
|
|
44
|
+
try:
|
|
45
|
+
return int(raw)
|
|
46
|
+
except ValueError:
|
|
47
|
+
return None
|
|
48
|
+
return None
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Canonical Chrys tool-kind vocabulary and out-of-band kind channel."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from typing import Any, Final
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
KIND_SHELL: Final[str] = "shell"
|
|
13
|
+
KIND_FILESYSTEM_READ: Final[str] = "filesystem.read"
|
|
14
|
+
KIND_FILESYSTEM_WRITE: Final[str] = "filesystem.write"
|
|
15
|
+
KIND_SEARCH: Final[str] = "search"
|
|
16
|
+
KIND_WEB_SEARCH: Final[str] = "web_search"
|
|
17
|
+
KIND_WEB_FETCH: Final[str] = "web_fetch"
|
|
18
|
+
KIND_ASK_USER: Final[str] = "ask_user"
|
|
19
|
+
KIND_SLEEP: Final[str] = "sleep"
|
|
20
|
+
KIND_SUB_AGENT: Final[str] = "sub_agent"
|
|
21
|
+
KIND_MCP: Final[str] = "mcp"
|
|
22
|
+
KIND_DOC_CONVERTER: Final[str] = "doc_converter"
|
|
23
|
+
KIND_SKILL: Final[str] = "skill"
|
|
24
|
+
KIND_CONTEXT: Final[str] = "context"
|
|
25
|
+
KIND_TODO: Final[str] = "todo"
|
|
26
|
+
|
|
27
|
+
# Canonical set of Chrys tool kinds - the form shared by YAML, hook matchers,
|
|
28
|
+
# approval-override keys and runtime events.
|
|
29
|
+
TOOL_KINDS: Final[frozenset[str]] = frozenset(
|
|
30
|
+
{
|
|
31
|
+
KIND_SHELL,
|
|
32
|
+
KIND_FILESYSTEM_READ,
|
|
33
|
+
KIND_FILESYSTEM_WRITE,
|
|
34
|
+
KIND_SEARCH,
|
|
35
|
+
KIND_WEB_SEARCH,
|
|
36
|
+
KIND_WEB_FETCH,
|
|
37
|
+
KIND_ASK_USER,
|
|
38
|
+
KIND_SLEEP,
|
|
39
|
+
KIND_SUB_AGENT,
|
|
40
|
+
KIND_MCP,
|
|
41
|
+
KIND_DOC_CONVERTER,
|
|
42
|
+
KIND_SKILL,
|
|
43
|
+
KIND_CONTEXT,
|
|
44
|
+
KIND_TODO,
|
|
45
|
+
}
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
TOOL_CALL_KIND_METADATA_KEY: Final[str] = "_chrys_tool_kind"
|
|
49
|
+
"""Structured tool kind persisted on assistant ``function_call`` contents.
|
|
50
|
+
|
|
51
|
+
Lives at the foundation layer so the kernel tool loop can stamp it on
|
|
52
|
+
calls that never reach the service-layer middleware (pre-pipeline argument
|
|
53
|
+
validation failures); ``chrys.service.session.message_metadata`` re-exports
|
|
54
|
+
it for existing importers.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
_KIND_ATTR: Final[str] = "chrys_kind"
|
|
58
|
+
|
|
59
|
+
# Pre-P1 runtime kinds were namespaced (``chrys.shell``); the deleted
|
|
60
|
+
# YAML<->runtime conversion layer also accepted that form directly in config.
|
|
61
|
+
_LEGACY_KIND_PREFIX: Final[str] = "chrys."
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def strip_legacy_kind_prefix(value: str, *, allow_tool_suffix: bool = False, source: str = "") -> str:
|
|
65
|
+
"""Strip the legacy ``chrys.`` prefix from a config-supplied kind, warning once per call.
|
|
66
|
+
|
|
67
|
+
Bounded compat for pre-P1 YAML: only values that were *meaningful* under
|
|
68
|
+
the old prefixed scheme are rewritten:
|
|
69
|
+
|
|
70
|
+
- ``chrys.<known kind>`` (``chrys.shell`` -> ``shell``);
|
|
71
|
+
- with ``allow_tool_suffix=True``, ``chrys.<known kind>.<tool>`` too
|
|
72
|
+
(approval-override keys; ``chrys.filesystem.write.write_file`` ->
|
|
73
|
+
``filesystem.write.write_file``).
|
|
74
|
+
|
|
75
|
+
Anything else (bare values, ``chrys.``-prefixed strings that never matched
|
|
76
|
+
a kind - possibly literal tool names) passes through unchanged.
|
|
77
|
+
"""
|
|
78
|
+
if not value.startswith(_LEGACY_KIND_PREFIX):
|
|
79
|
+
return value
|
|
80
|
+
bare = value[len(_LEGACY_KIND_PREFIX) :]
|
|
81
|
+
recognized = bare in TOOL_KINDS or (
|
|
82
|
+
allow_tool_suffix and any(bare.startswith(f"{kind}.") and len(bare) > len(kind) + 1 for kind in TOOL_KINDS)
|
|
83
|
+
)
|
|
84
|
+
if not recognized:
|
|
85
|
+
return value
|
|
86
|
+
logger.warning(
|
|
87
|
+
"Legacy tool-kind value %r in %s - the 'chrys.' runtime prefix was removed; use %r.",
|
|
88
|
+
value,
|
|
89
|
+
source or "config",
|
|
90
|
+
bare,
|
|
91
|
+
)
|
|
92
|
+
return bare
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def set_tool_kind(tool: Any, kind: str) -> None:
|
|
96
|
+
"""Classify *tool* with a Chrys kind, out of band."""
|
|
97
|
+
setattr(tool, _KIND_ATTR, kind)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def get_tool_kind(tool: Any) -> str | None:
|
|
101
|
+
"""Return the Chrys kind of *tool*, or ``None`` when unclassified."""
|
|
102
|
+
return getattr(tool, _KIND_ATTR, None)
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Shared keys and legacy text helpers for tool-result status."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import re
|
|
8
|
+
from collections.abc import Mapping
|
|
9
|
+
from contextvars import ContextVar
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from chrys.foundation.hosted_tools import HostedToolStatus, normalize_hosted_tool_status
|
|
13
|
+
from chrys.foundation.tool_kinds import (
|
|
14
|
+
KIND_ASK_USER,
|
|
15
|
+
KIND_CONTEXT,
|
|
16
|
+
KIND_DOC_CONVERTER,
|
|
17
|
+
KIND_FILESYSTEM_READ,
|
|
18
|
+
KIND_FILESYSTEM_WRITE,
|
|
19
|
+
KIND_SEARCH,
|
|
20
|
+
KIND_SHELL,
|
|
21
|
+
KIND_SKILL,
|
|
22
|
+
KIND_SLEEP,
|
|
23
|
+
KIND_SUB_AGENT,
|
|
24
|
+
KIND_WEB_FETCH,
|
|
25
|
+
KIND_WEB_SEARCH,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
tool_payload_observation: ContextVar[dict[str, object] | None] = ContextVar("tool_payload_observation", default=None)
|
|
29
|
+
"""Trajectory-only buffer for the active tool call's payload facts (truncation, spill artifact).
|
|
30
|
+
|
|
31
|
+
Nothing here is persisted on the result; the tool event middleware folds it
|
|
32
|
+
into ``tool.payload.observed``. It lives at the foundation layer because the
|
|
33
|
+
kernel's own result ceiling is the last thing to bound a result, and its
|
|
34
|
+
truncation would otherwise go unobserved.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def record_payload_truncation(
|
|
39
|
+
original_text: str,
|
|
40
|
+
*,
|
|
41
|
+
original_bytes: int | None = None,
|
|
42
|
+
artifact_name: str | None = None,
|
|
43
|
+
) -> None:
|
|
44
|
+
"""Note that the active tool call's output was bounded before reaching the model.
|
|
45
|
+
|
|
46
|
+
*original_bytes* stands in for *original_text*'s size when the tool saw
|
|
47
|
+
more output than it kept.
|
|
48
|
+
"""
|
|
49
|
+
observation = tool_payload_observation.get(None)
|
|
50
|
+
if observation is None:
|
|
51
|
+
return
|
|
52
|
+
if original_bytes is None:
|
|
53
|
+
original_bytes = len(original_text.encode("utf-8", errors="backslashreplace"))
|
|
54
|
+
# First writer wins the size: a later bounding pass only ever sees text
|
|
55
|
+
# that was already shortened, and the reader wants what the tool produced.
|
|
56
|
+
observation.setdefault("original_bytes", original_bytes)
|
|
57
|
+
observation["truncated"] = True
|
|
58
|
+
if artifact_name:
|
|
59
|
+
observation["artifact_id"] = artifact_name
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
TOOL_RESULT_METADATA_KEY = "_chrys_tool_result_metadata"
|
|
63
|
+
"""Structured renderer metadata persisted on ``function_result`` contents.
|
|
64
|
+
|
|
65
|
+
Lives at the foundation layer so the kernel tool loop can fold the dict the
|
|
66
|
+
event middleware carried in ``FunctionInvocationContext.metadata`` (same key,
|
|
67
|
+
same meaning) into the result content at construction — the only moment the
|
|
68
|
+
result's identity is unambiguous.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
TOOL_ERRORED_METADATA_KEY = "errored"
|
|
72
|
+
"""True when the tool invocation failed outside normal tool-result semantics."""
|
|
73
|
+
|
|
74
|
+
TOOL_FAILED_METADATA_KEY = "failed"
|
|
75
|
+
"""True when a tool returned a normal, structured failure result."""
|
|
76
|
+
|
|
77
|
+
TOOL_INTERRUPTED_METADATA_KEY = "interrupted"
|
|
78
|
+
"""True when cancellation answered an in-flight invocation."""
|
|
79
|
+
|
|
80
|
+
TOOL_POST_PROCESSING_INTERRUPTED_METADATA_KEY = "interrupted_post_processing"
|
|
81
|
+
"""True when the tool returned but cancellation interrupted result processing."""
|
|
82
|
+
|
|
83
|
+
TOOL_ERROR_KIND_METADATA_KEY = "tool_error_kind"
|
|
84
|
+
"""Stable category for a structured tool failure."""
|
|
85
|
+
|
|
86
|
+
TOOL_ERROR_MESSAGE_METADATA_KEY = "tool_error_message"
|
|
87
|
+
"""Human-readable structured tool failure message, without the ``Error:`` prefix."""
|
|
88
|
+
|
|
89
|
+
TOOL_FAILURE_TEXT_SYNTHESIZED_METADATA_KEY = "failure_text_synthesized"
|
|
90
|
+
"""True when Chrys synthesized a provider-hosted tool's fallback failure text."""
|
|
91
|
+
|
|
92
|
+
TOOL_ERROR_CODE_METADATA_KEY = "tool_error_code"
|
|
93
|
+
"""Optional provider/tool-specific structured error code."""
|
|
94
|
+
|
|
95
|
+
TOOL_ERROR_RETRYABLE_METADATA_KEY = "tool_error_retryable"
|
|
96
|
+
"""Optional structured retryability hint for a tool failure."""
|
|
97
|
+
|
|
98
|
+
TOOL_ERROR_DETAILS_METADATA_KEY = "tool_error_details"
|
|
99
|
+
"""Optional JSON-safe structured details for a tool failure."""
|
|
100
|
+
|
|
101
|
+
PROCESS_EXIT_CODE_METADATA_KEY = "process_exit_code"
|
|
102
|
+
"""Integer process exit code for generic subprocess-backed tool results."""
|
|
103
|
+
|
|
104
|
+
PROCESS_TIMED_OUT_METADATA_KEY = "process_timed_out"
|
|
105
|
+
"""True when a generic subprocess-backed tool result timed out."""
|
|
106
|
+
|
|
107
|
+
PROCESS_TIMEOUT_SECONDS_METADATA_KEY = "process_timeout_seconds"
|
|
108
|
+
"""Configured timeout, in seconds, for generic subprocess-backed tool results."""
|
|
109
|
+
|
|
110
|
+
SHELL_EXIT_CODE_METADATA_KEY = "shell_exit_code"
|
|
111
|
+
"""Integer process exit code for shell tool results."""
|
|
112
|
+
|
|
113
|
+
SHELL_TIMED_OUT_METADATA_KEY = "shell_timed_out"
|
|
114
|
+
"""True when the shell command was killed by Chrys timeout handling."""
|
|
115
|
+
|
|
116
|
+
SHELL_TIMEOUT_SECONDS_METADATA_KEY = "shell_timeout_seconds"
|
|
117
|
+
"""Configured timeout, in seconds, for timed-out shell commands."""
|
|
118
|
+
|
|
119
|
+
PARTIAL_OUTPUT_LABEL = "[partial output]"
|
|
120
|
+
"""The line that opens what a timed-out command or script printed, under its error line."""
|
|
121
|
+
|
|
122
|
+
WEB_SEARCH_METADATA_KEY = "web_search"
|
|
123
|
+
"""Provider id and result sources (``title`` and ``url`` only) for the web search card."""
|
|
124
|
+
|
|
125
|
+
WEB_SEARCH_TITLE_MAX_CHARS = 300
|
|
126
|
+
"""Longest source title the web search card shows, and so the longest one recorded."""
|
|
127
|
+
|
|
128
|
+
WEB_FETCH_FINAL_URL_METADATA_KEY = "web_fetch_final_url"
|
|
129
|
+
"""The URL a web fetch finally read, after same-site redirects, for the web fetch card."""
|
|
130
|
+
|
|
131
|
+
_RESULT_EXIT_CODE_SUFFIX_RE = re.compile(r"\n?\[exit_code:\s*(-?\d+)\][ \t\r\n]*$")
|
|
132
|
+
|
|
133
|
+
ERROR_TEXT_TOOL_KINDS = frozenset(
|
|
134
|
+
{
|
|
135
|
+
KIND_ASK_USER,
|
|
136
|
+
KIND_CONTEXT,
|
|
137
|
+
KIND_DOC_CONVERTER,
|
|
138
|
+
KIND_FILESYSTEM_READ,
|
|
139
|
+
KIND_FILESYSTEM_WRITE,
|
|
140
|
+
KIND_SEARCH,
|
|
141
|
+
KIND_WEB_SEARCH,
|
|
142
|
+
KIND_WEB_FETCH,
|
|
143
|
+
KIND_SHELL,
|
|
144
|
+
KIND_SKILL,
|
|
145
|
+
KIND_SLEEP,
|
|
146
|
+
KIND_SUB_AGENT,
|
|
147
|
+
}
|
|
148
|
+
)
|
|
149
|
+
"""Tool kinds where legacy ``Error:`` result text may indicate failure.
|
|
150
|
+
|
|
151
|
+
``KIND_SKILL`` / ``KIND_CONTEXT`` membership preserves failure-detection
|
|
152
|
+
parity: their tools sit in ``LEGACY_ERROR_TEXT_TOOL_NAMES`` (except
|
|
153
|
+
``list_compressed_contexts``), and the name fallback in
|
|
154
|
+
:func:`legacy_error_text_applies` only fires while the persisted kind is
|
|
155
|
+
empty — without these entries, stamping the new kinds would silently stop
|
|
156
|
+
treating legacy ``Error:`` text as failure on replay.
|
|
157
|
+
"""
|
|
158
|
+
|
|
159
|
+
LEGACY_ERROR_TEXT_TOOL_NAMES = frozenset(
|
|
160
|
+
{
|
|
161
|
+
"compress_context",
|
|
162
|
+
"convert_document",
|
|
163
|
+
"edit_file",
|
|
164
|
+
"execute",
|
|
165
|
+
"glob",
|
|
166
|
+
"grep",
|
|
167
|
+
"load_skill",
|
|
168
|
+
"ask_user",
|
|
169
|
+
"bash",
|
|
170
|
+
"cmd",
|
|
171
|
+
"csh",
|
|
172
|
+
"dash",
|
|
173
|
+
"fish",
|
|
174
|
+
"git_bash",
|
|
175
|
+
"ksh",
|
|
176
|
+
"list_workspace_dirs",
|
|
177
|
+
"powershell",
|
|
178
|
+
"pwsh",
|
|
179
|
+
"read_file",
|
|
180
|
+
"read_skill_resource",
|
|
181
|
+
"recall_context",
|
|
182
|
+
"run_skill_script",
|
|
183
|
+
"sh",
|
|
184
|
+
"sleep",
|
|
185
|
+
"tcsh",
|
|
186
|
+
"view_image",
|
|
187
|
+
"write_file",
|
|
188
|
+
"zsh",
|
|
189
|
+
}
|
|
190
|
+
)
|
|
191
|
+
"""Known Chrys-owned tool names kept for old session replay compatibility."""
|
|
192
|
+
|
|
193
|
+
REJECTION_ERROR_KINDS = frozenset({"approval_rejected", "hook_denied"})
|
|
194
|
+
"""Structured failure kinds that represent rejected tool execution."""
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def legacy_error_text_applies(tool_kind: str = "", tool_name: str = "") -> bool:
|
|
198
|
+
"""Return true when consumers may use legacy ``Error:`` text as a failure signal."""
|
|
199
|
+
return tool_kind in ERROR_TEXT_TOOL_KINDS or (not tool_kind and tool_name in LEGACY_ERROR_TEXT_TOOL_NAMES)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def result_text_exit_code(result: str) -> int | None:
|
|
203
|
+
"""Return a shell-style trailing exit code, when one is present."""
|
|
204
|
+
match = _RESULT_EXIT_CODE_SUFFIX_RE.search(result)
|
|
205
|
+
if match is None:
|
|
206
|
+
return None
|
|
207
|
+
return int(match.group(1))
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def result_text_without_exit_code(result: str) -> str:
|
|
211
|
+
"""Return result text with a trailing ``[exit_code: N]`` suffix removed."""
|
|
212
|
+
return _RESULT_EXIT_CODE_SUFFIX_RE.sub("", result).rstrip("\n")
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def shell_exit_code_from_metadata(metadata: Mapping[str, Any] | None) -> int | None:
|
|
216
|
+
"""Return a structured shell exit code, when metadata carries one."""
|
|
217
|
+
return _int_metadata_value(metadata, SHELL_EXIT_CODE_METADATA_KEY)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def process_exit_code_from_metadata(metadata: Mapping[str, Any] | None) -> int | None:
|
|
221
|
+
"""Return a structured generic process exit code, when metadata carries one."""
|
|
222
|
+
return _int_metadata_value(metadata, PROCESS_EXIT_CODE_METADATA_KEY)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def shell_timed_out_from_metadata(metadata: Mapping[str, Any] | None) -> bool:
|
|
226
|
+
"""Return true when structured metadata says the shell command timed out."""
|
|
227
|
+
return _bool_metadata_true(metadata, SHELL_TIMED_OUT_METADATA_KEY)
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def process_timed_out_from_metadata(metadata: Mapping[str, Any] | None) -> bool:
|
|
231
|
+
"""Return true when structured metadata says a generic process timed out."""
|
|
232
|
+
return _bool_metadata_true(metadata, PROCESS_TIMED_OUT_METADATA_KEY)
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def tool_result_metadata_is_rejected(metadata: Mapping[str, Any] | None) -> bool:
|
|
236
|
+
"""Return true when structured metadata says tool execution was rejected."""
|
|
237
|
+
if not metadata:
|
|
238
|
+
return False
|
|
239
|
+
if metadata.get("approval") == "user_rejected":
|
|
240
|
+
return True
|
|
241
|
+
return metadata.get(TOOL_ERROR_KIND_METADATA_KEY) in REJECTION_ERROR_KINDS
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
def tool_result_metadata_failure_state(metadata: Mapping[str, Any] | None) -> bool | None:
|
|
245
|
+
"""Return structured failure state, or None when metadata has no answer."""
|
|
246
|
+
if not metadata:
|
|
247
|
+
return None
|
|
248
|
+
if metadata.get(TOOL_ERRORED_METADATA_KEY) is True:
|
|
249
|
+
return True
|
|
250
|
+
if tool_result_metadata_is_rejected(metadata):
|
|
251
|
+
return True
|
|
252
|
+
failed = metadata.get(TOOL_FAILED_METADATA_KEY)
|
|
253
|
+
if failed is True:
|
|
254
|
+
return True
|
|
255
|
+
if process_timed_out_from_metadata(metadata) or shell_timed_out_from_metadata(metadata):
|
|
256
|
+
return True
|
|
257
|
+
exit_code = process_exit_code_from_metadata(metadata)
|
|
258
|
+
if exit_code is None:
|
|
259
|
+
exit_code = shell_exit_code_from_metadata(metadata)
|
|
260
|
+
if exit_code is not None:
|
|
261
|
+
return exit_code != 0
|
|
262
|
+
if failed is False:
|
|
263
|
+
return False
|
|
264
|
+
return None
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def _int_metadata_value(metadata: Mapping[str, Any] | None, key: str) -> int | None:
|
|
268
|
+
if not metadata:
|
|
269
|
+
return None
|
|
270
|
+
value = metadata.get(key)
|
|
271
|
+
if isinstance(value, bool):
|
|
272
|
+
return None
|
|
273
|
+
return value if isinstance(value, int) else None
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def _bool_metadata_true(metadata: Mapping[str, Any] | None, key: str) -> bool:
|
|
277
|
+
if not metadata:
|
|
278
|
+
return False
|
|
279
|
+
return metadata.get(key) is True
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def canonical_tool_result_status(provider_status: str | None, metadata: Mapping[str, Any] | None) -> str:
|
|
283
|
+
"""Prefer a terminal provider status, then structured tool-result failure metadata."""
|
|
284
|
+
status = normalize_hosted_tool_status(provider_status)
|
|
285
|
+
if status in {HostedToolStatus.COMPLETED, HostedToolStatus.FAILED, HostedToolStatus.INTERRUPTED}:
|
|
286
|
+
return status.value
|
|
287
|
+
return "failed" if tool_result_metadata_failure_state(metadata) is True else "completed"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Append-only trajectory event log: envelope, writer, reader, and helpers.
|
|
4
|
+
|
|
5
|
+
``session.json`` holds the conversation truth; ``<session>/trajectory/events.jsonl``
|
|
6
|
+
holds the execution truth — one content-minimized JSON event per line, written
|
|
7
|
+
through a single per-session writer with written-ack semantics. This package is
|
|
8
|
+
the foundation-tier contract: every module here depends on the standard library
|
|
9
|
+
and sibling foundation helpers only.
|
|
10
|
+
"""
|