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,683 @@
|
|
|
1
|
+
# Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Unified transcript exchange grammar.
|
|
4
|
+
|
|
5
|
+
One implementation of the exchange walk every transcript consumer shares,
|
|
6
|
+
over an accessor protocol so live ``Message`` objects and their ``to_dict``
|
|
7
|
+
serializations run the same code. The grammar:
|
|
8
|
+
|
|
9
|
+
- an EXCHANGE is a maximal run of consecutive assistant siblings containing
|
|
10
|
+
at least one tool call (text-only and reasoning-only siblings ride the same
|
|
11
|
+
run), followed by the tool output answering it — tool-role messages and
|
|
12
|
+
result-only assistant messages (hosted MCP reports results assistant-role);
|
|
13
|
+
- a message carrying a history marker is a hard boundary in BOTH walks: never
|
|
14
|
+
a response sibling, never part of the output run;
|
|
15
|
+
- a result-only assistant message belongs to the output block, never to the
|
|
16
|
+
response run; a message with empty contents is NOT result-only;
|
|
17
|
+
- a call-carrying assistant after tool output starts a new exchange;
|
|
18
|
+
- a call-carrying assistant's own result-type contents are the exchange's
|
|
19
|
+
EMBEDDED results: pairing follows the message-by-message rule — message
|
|
20
|
+
N's calls register before message N's embedded results consume, so an
|
|
21
|
+
embedded result may answer its own message's calls even when it physically
|
|
22
|
+
precedes them, but never a call introduced by a later sibling;
|
|
23
|
+
- ``legacy``-typed contents count as calls in the dict accessor only: the
|
|
24
|
+
type exists solely in serialized transcripts from older sessions.
|
|
25
|
+
|
|
26
|
+
Pairing is policy-driven: each consumer declares a :class:`PairingPolicy`
|
|
27
|
+
row (call/result type scope, informational gating, the None-id and
|
|
28
|
+
empty-id policies, and how malformed non-string ids normalize). The
|
|
29
|
+
accessor reports raw facts only — every pairing decision lives in
|
|
30
|
+
:func:`pair_results`.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
from collections.abc import Mapping
|
|
36
|
+
from dataclasses import dataclass, field
|
|
37
|
+
from enum import Enum
|
|
38
|
+
from typing import TYPE_CHECKING, Any, Literal, Protocol
|
|
39
|
+
|
|
40
|
+
from chrys.foundation.models.history_markers import HistoryMarkerKind
|
|
41
|
+
from chrys.foundation.tool_result_metadata import TOOL_ERROR_KIND_METADATA_KEY
|
|
42
|
+
|
|
43
|
+
if TYPE_CHECKING:
|
|
44
|
+
from collections.abc import Iterator, Sequence
|
|
45
|
+
|
|
46
|
+
# ---------------------------------------------------------------------------
|
|
47
|
+
# Content-type sets (moved here from kernel.compaction so the iterator does
|
|
48
|
+
# not import the compaction module; compaction re-exports them unchanged)
|
|
49
|
+
# ---------------------------------------------------------------------------
|
|
50
|
+
|
|
51
|
+
# All content types that represent a tool invocation requested by the model.
|
|
52
|
+
# The Phase 4 last-words side call must reject responses carrying any of
|
|
53
|
+
# these in ANY message; note that compaction's ``_is_tool_call_assistant``
|
|
54
|
+
# helper restricts itself to assistant messages and must not be reused for
|
|
55
|
+
# that guard.
|
|
56
|
+
TOOL_CALL_CONTENT_TYPES = frozenset(
|
|
57
|
+
{
|
|
58
|
+
"function_call",
|
|
59
|
+
"hosted_tool_call",
|
|
60
|
+
"code_interpreter_tool_call",
|
|
61
|
+
"image_generation_tool_call",
|
|
62
|
+
"mcp_server_tool_call",
|
|
63
|
+
"search_tool_call",
|
|
64
|
+
"shell_tool_call",
|
|
65
|
+
}
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
# Content types carrying the result half of a tool invocation; results can
|
|
69
|
+
# ride in assistant-role messages (hosted MCP), not only tool-role ones.
|
|
70
|
+
TOOL_RESULT_CONTENT_TYPES = frozenset(
|
|
71
|
+
{
|
|
72
|
+
"function_result",
|
|
73
|
+
"hosted_tool_result",
|
|
74
|
+
"code_interpreter_tool_result",
|
|
75
|
+
"image_generation_tool_result",
|
|
76
|
+
"mcp_server_tool_result",
|
|
77
|
+
"search_tool_result",
|
|
78
|
+
"shell_tool_result",
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
# Serialized transcripts from older sessions carry ``legacy``-typed call
|
|
83
|
+
# contents; the type never appears on live kernel objects, so only the dict
|
|
84
|
+
# accessor treats it as a call.
|
|
85
|
+
LEGACY_CALL_CONTENT_TYPE = "legacy"
|
|
86
|
+
|
|
87
|
+
# The two content types that pair on ``image_id`` (their ``call_id`` is
|
|
88
|
+
# always None); every other call/result type pairs on ``call_id``.
|
|
89
|
+
_IMAGE_CONTENT_TYPES = frozenset({"image_generation_tool_call", "image_generation_tool_result"})
|
|
90
|
+
|
|
91
|
+
# Error kinds a tool result may carry when the kernel rejected the call
|
|
92
|
+
# before dispatch; the POSITIONAL_FAILURES policy consumes id-less failure
|
|
93
|
+
# results only when they carry one of these.
|
|
94
|
+
PREVALIDATION_ERROR_KINDS = frozenset({"argument_parsing", "argument_truncated", "tool_not_found"})
|
|
95
|
+
|
|
96
|
+
PairingKey = tuple[Literal["call_id", "image_id"], str]
|
|
97
|
+
"""Namespaced pairing id: image generation pairs on ``image_id`` in its own
|
|
98
|
+
namespace, so an equal string in the other namespace never matches."""
|
|
99
|
+
|
|
100
|
+
FalsyStream = Literal["none", "empty"]
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
# ---------------------------------------------------------------------------
|
|
104
|
+
# Accessors
|
|
105
|
+
# ---------------------------------------------------------------------------
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class MessageAccessor(Protocol):
|
|
109
|
+
"""Raw-fact reads over one transcript representation.
|
|
110
|
+
|
|
111
|
+
The accessor never derives pairing keys and never applies policy: it
|
|
112
|
+
reports the verbatim identifier in the content's own namespace, and
|
|
113
|
+
:func:`pair_results` normalizes it per the consumer's policy row.
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
def role(self, message: Any) -> str: ...
|
|
117
|
+
|
|
118
|
+
def contents(self, message: Any) -> Sequence[Any]: ...
|
|
119
|
+
|
|
120
|
+
def content_type(self, content: Any) -> str | None: ...
|
|
121
|
+
|
|
122
|
+
def raw_id(self, content: Any) -> object: ...
|
|
123
|
+
|
|
124
|
+
def is_informational(self, content: Any) -> bool: ...
|
|
125
|
+
|
|
126
|
+
def error_kind(self, content: Any) -> str | None: ...
|
|
127
|
+
|
|
128
|
+
def has_marker(self, message: Any) -> bool: ...
|
|
129
|
+
|
|
130
|
+
def call_types(self) -> frozenset[str]: ...
|
|
131
|
+
|
|
132
|
+
def result_types(self) -> frozenset[str]: ...
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class LiveAccessor:
|
|
136
|
+
"""Accessor over live kernel ``Message``/``Content`` objects."""
|
|
137
|
+
|
|
138
|
+
def role(self, message: Any) -> str:
|
|
139
|
+
return message.role
|
|
140
|
+
|
|
141
|
+
def contents(self, message: Any) -> Sequence[Any]:
|
|
142
|
+
return message.contents
|
|
143
|
+
|
|
144
|
+
def content_type(self, content: Any) -> str | None:
|
|
145
|
+
return content.type
|
|
146
|
+
|
|
147
|
+
def raw_id(self, content: Any) -> object:
|
|
148
|
+
if content.type in _IMAGE_CONTENT_TYPES:
|
|
149
|
+
return content.image_id
|
|
150
|
+
return content.call_id
|
|
151
|
+
|
|
152
|
+
def is_informational(self, content: Any) -> bool:
|
|
153
|
+
return bool(content.informational_only)
|
|
154
|
+
|
|
155
|
+
def error_kind(self, content: Any) -> str | None:
|
|
156
|
+
kind = content.additional_properties.get(TOOL_ERROR_KIND_METADATA_KEY)
|
|
157
|
+
return kind if isinstance(kind, str) else None
|
|
158
|
+
|
|
159
|
+
def has_marker(self, message: Any) -> bool:
|
|
160
|
+
# KEY presence, not value truthiness: the value is the marker kind,
|
|
161
|
+
# and a falsy kind must still bound the exchange (fail-closed).
|
|
162
|
+
return HistoryMarkerKind.KEY in message.additional_properties
|
|
163
|
+
|
|
164
|
+
def call_types(self) -> frozenset[str]:
|
|
165
|
+
return TOOL_CALL_CONTENT_TYPES
|
|
166
|
+
|
|
167
|
+
def result_types(self) -> frozenset[str]:
|
|
168
|
+
return TOOL_RESULT_CONTENT_TYPES
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
_DICT_CALL_CONTENT_TYPES = TOOL_CALL_CONTENT_TYPES | {LEGACY_CALL_CONTENT_TYPE}
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
class DictAccessor:
|
|
175
|
+
"""Accessor over ``Message.to_dict()`` transcript serializations."""
|
|
176
|
+
|
|
177
|
+
def role(self, message: Mapping[str, Any]) -> str:
|
|
178
|
+
role = message.get("role")
|
|
179
|
+
return role if isinstance(role, str) else ""
|
|
180
|
+
|
|
181
|
+
def contents(self, message: Mapping[str, Any]) -> Sequence[Any]:
|
|
182
|
+
contents = message.get("contents")
|
|
183
|
+
return contents if isinstance(contents, list) else []
|
|
184
|
+
|
|
185
|
+
def content_type(self, content: Any) -> str | None:
|
|
186
|
+
if not isinstance(content, Mapping):
|
|
187
|
+
return None
|
|
188
|
+
content_type = content.get("type")
|
|
189
|
+
return content_type if isinstance(content_type, str) else None
|
|
190
|
+
|
|
191
|
+
def raw_id(self, content: Any) -> object:
|
|
192
|
+
if not isinstance(content, Mapping):
|
|
193
|
+
return None
|
|
194
|
+
if content.get("type") in _IMAGE_CONTENT_TYPES:
|
|
195
|
+
return content.get("image_id")
|
|
196
|
+
return content.get("call_id")
|
|
197
|
+
|
|
198
|
+
def is_informational(self, content: Any) -> bool:
|
|
199
|
+
if not isinstance(content, Mapping):
|
|
200
|
+
return False
|
|
201
|
+
# Mirror of the live constructor rule: mcp_server_tool_call is forced
|
|
202
|
+
# informational at construction (whether or not the flag serialized).
|
|
203
|
+
return bool(content.get("informational_only")) or content.get("type") == "mcp_server_tool_call"
|
|
204
|
+
|
|
205
|
+
def error_kind(self, content: Any) -> str | None:
|
|
206
|
+
if not isinstance(content, Mapping):
|
|
207
|
+
return None
|
|
208
|
+
properties = content.get("additional_properties")
|
|
209
|
+
if not isinstance(properties, Mapping):
|
|
210
|
+
return None
|
|
211
|
+
kind = properties.get(TOOL_ERROR_KIND_METADATA_KEY)
|
|
212
|
+
return kind if isinstance(kind, str) else None
|
|
213
|
+
|
|
214
|
+
def has_marker(self, message: Mapping[str, Any]) -> bool:
|
|
215
|
+
properties = message.get("additional_properties")
|
|
216
|
+
return isinstance(properties, Mapping) and HistoryMarkerKind.KEY in properties
|
|
217
|
+
|
|
218
|
+
def call_types(self) -> frozenset[str]:
|
|
219
|
+
return _DICT_CALL_CONTENT_TYPES
|
|
220
|
+
|
|
221
|
+
def result_types(self) -> frozenset[str]:
|
|
222
|
+
return TOOL_RESULT_CONTENT_TYPES
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
# ---------------------------------------------------------------------------
|
|
226
|
+
# Grammar dataclasses and policy
|
|
227
|
+
# ---------------------------------------------------------------------------
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
@dataclass(frozen=True)
|
|
231
|
+
class Occurrence:
|
|
232
|
+
"""One call or result CONTENT occurrence, addressed by coordinates.
|
|
233
|
+
|
|
234
|
+
``raw_id`` is the normalized tri-state (``None`` / ``""`` / non-empty
|
|
235
|
+
string): a non-string verbatim value has already passed through the
|
|
236
|
+
consuming policy's ``malformed_id`` rule. Consumers needing the original
|
|
237
|
+
value (external correlation, persisted/emitted ids) dereference the
|
|
238
|
+
content at these coordinates and apply their own transform — the
|
|
239
|
+
normalized value drives pairing-derived decisions only.
|
|
240
|
+
"""
|
|
241
|
+
|
|
242
|
+
message_index: int
|
|
243
|
+
content_index: int
|
|
244
|
+
raw_id: str | None
|
|
245
|
+
content_type: str
|
|
246
|
+
error_kind: str | None
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
@dataclass(frozen=True)
|
|
250
|
+
class Exchange:
|
|
251
|
+
"""One response run plus the tool output answering it.
|
|
252
|
+
|
|
253
|
+
``response_indices`` and ``output_indices`` never share a message, and
|
|
254
|
+
embedded results (result contents riding the response messages
|
|
255
|
+
themselves) are listed separately so nothing double-scans. Embedded
|
|
256
|
+
occurrences here carry the policy-free structural view of the id
|
|
257
|
+
(strings and ``None`` verbatim; non-string values stringified) —
|
|
258
|
+
pairing consumers read :func:`pair_results` views, whose occurrences
|
|
259
|
+
are normalized per their own policy row.
|
|
260
|
+
"""
|
|
261
|
+
|
|
262
|
+
response_indices: tuple[int, ...]
|
|
263
|
+
output_indices: tuple[int, ...]
|
|
264
|
+
embedded_results: tuple[Occurrence, ...]
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
class NoneIdPolicy(Enum):
|
|
268
|
+
"""How a consumer treats ``None``-id call/result occurrences."""
|
|
269
|
+
|
|
270
|
+
IGNORE = "ignore"
|
|
271
|
+
UNPAIRABLE_OCCURRENCE = "unpairable_occurrence"
|
|
272
|
+
POSITIONAL_FAILURES = "positional_failures"
|
|
273
|
+
POSITIONAL = "positional"
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
class EmptyIdPolicy(Enum):
|
|
277
|
+
"""How a consumer treats ``""``-id call/result occurrences."""
|
|
278
|
+
|
|
279
|
+
IGNORE = "ignore"
|
|
280
|
+
COERCED_SINGLE_KEY = "coerced_single_key"
|
|
281
|
+
POSITIONAL = "positional"
|
|
282
|
+
UNPAIRABLE_OCCURRENCE = "unpairable_occurrence"
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
@dataclass(frozen=True)
|
|
286
|
+
class PairingPolicy:
|
|
287
|
+
"""One consumer's declared pairing row (the §3.1 policy table).
|
|
288
|
+
|
|
289
|
+
``malformed_id`` is required on every row: restored sessions build live
|
|
290
|
+
contents from serialized dicts with no validation, so non-string ids
|
|
291
|
+
reach live consumers too. ``stringify`` maps a truthy non-string to
|
|
292
|
+
``str(value)`` and a falsy non-string to ``""``; ``treat_as_none`` maps
|
|
293
|
+
any non-string to ``None``. Strings always pass through verbatim.
|
|
294
|
+
"""
|
|
295
|
+
|
|
296
|
+
call_types: frozenset[str]
|
|
297
|
+
include_informational_calls: bool
|
|
298
|
+
result_types: frozenset[str]
|
|
299
|
+
none_id: NoneIdPolicy
|
|
300
|
+
empty_id: EmptyIdPolicy
|
|
301
|
+
malformed_id: Literal["stringify", "treat_as_none"]
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
@dataclass(frozen=True)
|
|
305
|
+
class EligibleResults:
|
|
306
|
+
"""Inventory minus forward orphans, keyed for post-pairing consumers.
|
|
307
|
+
|
|
308
|
+
A truthy result is eligible when it registered at-or-after the first
|
|
309
|
+
same-key call registration; a falsy result when ANY falsy call — either
|
|
310
|
+
stream — registered before it (combined-falsy: the block-wide falsy
|
|
311
|
+
boolean consumers derive from this view is stream-blind today).
|
|
312
|
+
"""
|
|
313
|
+
|
|
314
|
+
truthy: dict[PairingKey, list[Occurrence]] = field(default_factory=dict)
|
|
315
|
+
falsy: dict[FalsyStream, list[Occurrence]] = field(default_factory=dict)
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
@dataclass(frozen=True)
|
|
319
|
+
class ExchangePairing:
|
|
320
|
+
"""Pairing views for one exchange under one policy row.
|
|
321
|
+
|
|
322
|
+
- ``truthy_assignments``: per key, call occurrences in registration
|
|
323
|
+
order, each mapped to the result occurrence that consumed it or
|
|
324
|
+
``None`` — one result consumes one call occurrence (shared cursor);
|
|
325
|
+
- ``unconsumed_results``: truthy results no call consumed (forward
|
|
326
|
+
orphans included — a result registering before any same-key call is
|
|
327
|
+
an orphan by the no-forward-pairing rule);
|
|
328
|
+
- ``falsy_assignments`` / ``falsy_unconsumed_results``: the separated
|
|
329
|
+
None/empty two-phase queues (occurrence order);
|
|
330
|
+
- ``unpairable_calls`` / ``unpairable_results``: occurrences surfaced by
|
|
331
|
+
an UNPAIRABLE_OCCURRENCE policy — visible, never paired;
|
|
332
|
+
- ``eligible_results``: see :class:`EligibleResults`.
|
|
333
|
+
"""
|
|
334
|
+
|
|
335
|
+
truthy_assignments: dict[PairingKey, list[tuple[Occurrence, Occurrence | None]]]
|
|
336
|
+
unconsumed_results: dict[PairingKey, list[Occurrence]]
|
|
337
|
+
falsy_assignments: dict[FalsyStream, list[tuple[Occurrence, Occurrence | None]]]
|
|
338
|
+
falsy_unconsumed_results: dict[FalsyStream, list[Occurrence]]
|
|
339
|
+
unpairable_calls: tuple[Occurrence, ...]
|
|
340
|
+
unpairable_results: tuple[Occurrence, ...]
|
|
341
|
+
eligible_results: EligibleResults
|
|
342
|
+
|
|
343
|
+
@property
|
|
344
|
+
def result_keys(self) -> set[PairingKey]:
|
|
345
|
+
"""Inventory: every truthy key with at least one result occurrence."""
|
|
346
|
+
return set(self.results_by_key)
|
|
347
|
+
|
|
348
|
+
@property
|
|
349
|
+
def results_by_key(self) -> dict[PairingKey, list[Occurrence]]:
|
|
350
|
+
"""Inventory: every truthy result occurrence by key, orphans included."""
|
|
351
|
+
inventory: dict[PairingKey, list[Occurrence]] = {}
|
|
352
|
+
for key, assignments in self.truthy_assignments.items():
|
|
353
|
+
for _call, result in assignments:
|
|
354
|
+
if result is not None:
|
|
355
|
+
inventory.setdefault(key, []).append(result)
|
|
356
|
+
for key, orphans in self.unconsumed_results.items():
|
|
357
|
+
inventory.setdefault(key, []).extend(orphans)
|
|
358
|
+
return inventory
|
|
359
|
+
|
|
360
|
+
@property
|
|
361
|
+
def answered_keys(self) -> set[PairingKey]:
|
|
362
|
+
"""Consumed-only view: keys holding at least one non-None assignment.
|
|
363
|
+
|
|
364
|
+
Completeness consumers read this, never ``result_keys`` — a
|
|
365
|
+
forward-reference embedded result is an orphan and must not make its
|
|
366
|
+
call look answered.
|
|
367
|
+
"""
|
|
368
|
+
return {
|
|
369
|
+
key
|
|
370
|
+
for key, assignments in self.truthy_assignments.items()
|
|
371
|
+
if any(result is not None for _call, result in assignments)
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
# ---------------------------------------------------------------------------
|
|
376
|
+
# Predicates
|
|
377
|
+
# ---------------------------------------------------------------------------
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
def is_result_only_message(message: Any, accessor: MessageAccessor) -> bool:
|
|
381
|
+
"""Role-gated result-only predicate: an assistant message carrying tool
|
|
382
|
+
results for an earlier call and no new calls. Results ride tool-role or
|
|
383
|
+
assistant-role messages only, so any other role is never result-only."""
|
|
384
|
+
if accessor.role(message) != "assistant":
|
|
385
|
+
return False
|
|
386
|
+
call_types = accessor.call_types()
|
|
387
|
+
result_types = accessor.result_types()
|
|
388
|
+
saw_result = False
|
|
389
|
+
for content in accessor.contents(message):
|
|
390
|
+
content_type = accessor.content_type(content)
|
|
391
|
+
if content_type in call_types:
|
|
392
|
+
return False
|
|
393
|
+
if content_type in result_types:
|
|
394
|
+
saw_result = True
|
|
395
|
+
return saw_result
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
def _carries_call(message: Any, accessor: MessageAccessor) -> bool:
|
|
399
|
+
call_types = accessor.call_types()
|
|
400
|
+
return any(accessor.content_type(content) in call_types for content in accessor.contents(message))
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
def _structural_raw_id(verbatim: object) -> str | None:
|
|
404
|
+
"""Policy-free id view for :class:`Exchange` embedded occurrences."""
|
|
405
|
+
if verbatim is None or isinstance(verbatim, str):
|
|
406
|
+
return verbatim
|
|
407
|
+
return str(verbatim) if verbatim else ""
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
# ---------------------------------------------------------------------------
|
|
411
|
+
# Iterator
|
|
412
|
+
# ---------------------------------------------------------------------------
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
def iter_exchanges(messages: Sequence[Any], accessor: MessageAccessor) -> Iterator[Exchange]:
|
|
416
|
+
"""Yield every exchange of *messages* in transcript order.
|
|
417
|
+
|
|
418
|
+
Only call-bearing response runs form exchanges; assistant runs without
|
|
419
|
+
a single call content, orphan output, markers, and other-role messages
|
|
420
|
+
are skipped (they belong to no exchange).
|
|
421
|
+
"""
|
|
422
|
+
result_types = accessor.result_types()
|
|
423
|
+
total = len(messages)
|
|
424
|
+
index = 0
|
|
425
|
+
while index < total:
|
|
426
|
+
message = messages[index]
|
|
427
|
+
if (
|
|
428
|
+
accessor.has_marker(message)
|
|
429
|
+
or accessor.role(message) != "assistant"
|
|
430
|
+
or is_result_only_message(message, accessor)
|
|
431
|
+
):
|
|
432
|
+
index += 1
|
|
433
|
+
continue
|
|
434
|
+
|
|
435
|
+
run_start = index
|
|
436
|
+
while (
|
|
437
|
+
index < total
|
|
438
|
+
and accessor.role(messages[index]) == "assistant"
|
|
439
|
+
and not accessor.has_marker(messages[index])
|
|
440
|
+
and not is_result_only_message(messages[index], accessor)
|
|
441
|
+
):
|
|
442
|
+
index += 1
|
|
443
|
+
response_indices = tuple(range(run_start, index))
|
|
444
|
+
|
|
445
|
+
if not any(_carries_call(messages[i], accessor) for i in response_indices):
|
|
446
|
+
continue
|
|
447
|
+
|
|
448
|
+
output_start = index
|
|
449
|
+
while index < total and not accessor.has_marker(messages[index]):
|
|
450
|
+
candidate = messages[index]
|
|
451
|
+
if accessor.role(candidate) == "tool" or is_result_only_message(candidate, accessor):
|
|
452
|
+
index += 1
|
|
453
|
+
continue
|
|
454
|
+
break
|
|
455
|
+
output_indices = tuple(range(output_start, index))
|
|
456
|
+
|
|
457
|
+
embedded: list[Occurrence] = []
|
|
458
|
+
for message_index in response_indices:
|
|
459
|
+
for content_index, content in enumerate(accessor.contents(messages[message_index])):
|
|
460
|
+
content_type = accessor.content_type(content)
|
|
461
|
+
if content_type in result_types:
|
|
462
|
+
embedded.append(
|
|
463
|
+
Occurrence(
|
|
464
|
+
message_index=message_index,
|
|
465
|
+
content_index=content_index,
|
|
466
|
+
raw_id=_structural_raw_id(accessor.raw_id(content)),
|
|
467
|
+
content_type=content_type,
|
|
468
|
+
error_kind=accessor.error_kind(content),
|
|
469
|
+
)
|
|
470
|
+
)
|
|
471
|
+
|
|
472
|
+
yield Exchange(
|
|
473
|
+
response_indices=response_indices,
|
|
474
|
+
output_indices=output_indices,
|
|
475
|
+
embedded_results=tuple(embedded),
|
|
476
|
+
)
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
# ---------------------------------------------------------------------------
|
|
480
|
+
# Pairing
|
|
481
|
+
# ---------------------------------------------------------------------------
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
def _normalize_raw_id(verbatim: object, policy: PairingPolicy) -> str | None:
|
|
485
|
+
if verbatim is None or isinstance(verbatim, str):
|
|
486
|
+
return verbatim
|
|
487
|
+
if policy.malformed_id == "stringify":
|
|
488
|
+
return str(verbatim) if verbatim else ""
|
|
489
|
+
return None
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
def _namespace(content_type: str) -> Literal["call_id", "image_id"]:
|
|
493
|
+
return "image_id" if content_type in _IMAGE_CONTENT_TYPES else "call_id"
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
def namespaced_pairing_key(content_type: str, raw_id: object) -> PairingKey | None:
|
|
497
|
+
"""Return the canonical truthy pairing key for one call/result occurrence."""
|
|
498
|
+
if not isinstance(raw_id, str) or not raw_id:
|
|
499
|
+
return None
|
|
500
|
+
return (_namespace(content_type), raw_id)
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
class _PairingState:
|
|
504
|
+
"""Mutable two-phase pairing walk state for one exchange."""
|
|
505
|
+
|
|
506
|
+
def __init__(self, policy: PairingPolicy) -> None:
|
|
507
|
+
self.policy = policy
|
|
508
|
+
self.sequence = 0
|
|
509
|
+
self.truthy_assignments: dict[PairingKey, list[list[Occurrence | None]]] = {}
|
|
510
|
+
self.unconsumed_results: dict[PairingKey, list[Occurrence]] = {}
|
|
511
|
+
self.falsy_assignments: dict[FalsyStream, list[list[Occurrence | None]]] = {"none": [], "empty": []}
|
|
512
|
+
self.falsy_unconsumed: dict[FalsyStream, list[Occurrence]] = {"none": [], "empty": []}
|
|
513
|
+
self.unpairable_calls: list[Occurrence] = []
|
|
514
|
+
self.unpairable_results: list[Occurrence] = []
|
|
515
|
+
self.first_call_seq: dict[PairingKey, int] = {}
|
|
516
|
+
self.first_falsy_call_seq: int | None = None
|
|
517
|
+
self.eligible_truthy: dict[PairingKey, list[Occurrence]] = {}
|
|
518
|
+
self.eligible_falsy: dict[FalsyStream, list[Occurrence]] = {"none": [], "empty": []}
|
|
519
|
+
|
|
520
|
+
def _next_seq(self) -> int:
|
|
521
|
+
self.sequence += 1
|
|
522
|
+
return self.sequence
|
|
523
|
+
|
|
524
|
+
def _falsy_stream(self, raw_id: str | None) -> FalsyStream:
|
|
525
|
+
return "none" if raw_id is None else "empty"
|
|
526
|
+
|
|
527
|
+
def _falsy_call_policy(self, raw_id: str | None) -> NoneIdPolicy | EmptyIdPolicy:
|
|
528
|
+
return self.policy.none_id if raw_id is None else self.policy.empty_id
|
|
529
|
+
|
|
530
|
+
def register_call(self, occurrence: Occurrence) -> None:
|
|
531
|
+
seq = self._next_seq()
|
|
532
|
+
raw_id = occurrence.raw_id
|
|
533
|
+
if raw_id:
|
|
534
|
+
key = namespaced_pairing_key(occurrence.content_type, raw_id)
|
|
535
|
+
if key is None:
|
|
536
|
+
raise RuntimeError("An occurrence with a non-empty id must have a pairing key.")
|
|
537
|
+
self.first_call_seq.setdefault(key, seq)
|
|
538
|
+
self.truthy_assignments.setdefault(key, []).append([occurrence, None])
|
|
539
|
+
return
|
|
540
|
+
|
|
541
|
+
policy = self._falsy_call_policy(raw_id)
|
|
542
|
+
if policy in (NoneIdPolicy.IGNORE, EmptyIdPolicy.IGNORE):
|
|
543
|
+
return
|
|
544
|
+
if self.first_falsy_call_seq is None:
|
|
545
|
+
self.first_falsy_call_seq = seq
|
|
546
|
+
if policy in (NoneIdPolicy.UNPAIRABLE_OCCURRENCE, EmptyIdPolicy.UNPAIRABLE_OCCURRENCE):
|
|
547
|
+
self.unpairable_calls.append(occurrence)
|
|
548
|
+
return
|
|
549
|
+
if policy is EmptyIdPolicy.COERCED_SINGLE_KEY:
|
|
550
|
+
# Legacy conflated queue: empty-id occurrences ride the None
|
|
551
|
+
# stream's queue, mirroring the single coerced key they shared.
|
|
552
|
+
self.falsy_assignments["none"].append([occurrence, None])
|
|
553
|
+
return
|
|
554
|
+
self.falsy_assignments[self._falsy_stream(raw_id)].append([occurrence, None])
|
|
555
|
+
|
|
556
|
+
def consume_result(self, occurrence: Occurrence) -> None:
|
|
557
|
+
seq = self._next_seq()
|
|
558
|
+
raw_id = occurrence.raw_id
|
|
559
|
+
if raw_id:
|
|
560
|
+
key = namespaced_pairing_key(occurrence.content_type, raw_id)
|
|
561
|
+
if key is None:
|
|
562
|
+
raise RuntimeError("An occurrence with a non-empty id must have a pairing key.")
|
|
563
|
+
first_seen = self.first_call_seq.get(key)
|
|
564
|
+
if first_seen is not None and first_seen <= seq:
|
|
565
|
+
self.eligible_truthy.setdefault(key, []).append(occurrence)
|
|
566
|
+
for slot in self.truthy_assignments.get(key, []):
|
|
567
|
+
if slot[1] is None:
|
|
568
|
+
slot[1] = occurrence
|
|
569
|
+
return
|
|
570
|
+
self.unconsumed_results.setdefault(key, []).append(occurrence)
|
|
571
|
+
return
|
|
572
|
+
|
|
573
|
+
policy = self._falsy_call_policy(raw_id)
|
|
574
|
+
if policy in (NoneIdPolicy.IGNORE, EmptyIdPolicy.IGNORE):
|
|
575
|
+
return
|
|
576
|
+
stream = self._falsy_stream(raw_id)
|
|
577
|
+
if self.first_falsy_call_seq is not None and self.first_falsy_call_seq <= seq:
|
|
578
|
+
self.eligible_falsy[stream].append(occurrence)
|
|
579
|
+
if policy in (NoneIdPolicy.UNPAIRABLE_OCCURRENCE, EmptyIdPolicy.UNPAIRABLE_OCCURRENCE):
|
|
580
|
+
self.unpairable_results.append(occurrence)
|
|
581
|
+
return
|
|
582
|
+
if policy is NoneIdPolicy.POSITIONAL_FAILURES and occurrence.error_kind not in PREVALIDATION_ERROR_KINDS:
|
|
583
|
+
# An arbitrary id-less result must not eat the slot ahead of a
|
|
584
|
+
# later qualifying failure; it stays surfaced, never consuming.
|
|
585
|
+
self.falsy_unconsumed[stream].append(occurrence)
|
|
586
|
+
return
|
|
587
|
+
queue_stream: FalsyStream = "none" if policy is EmptyIdPolicy.COERCED_SINGLE_KEY else stream
|
|
588
|
+
for slot in self.falsy_assignments[queue_stream]:
|
|
589
|
+
if slot[1] is None:
|
|
590
|
+
slot[1] = occurrence
|
|
591
|
+
return
|
|
592
|
+
self.falsy_unconsumed[stream].append(occurrence)
|
|
593
|
+
|
|
594
|
+
def finish(self) -> ExchangePairing:
|
|
595
|
+
return ExchangePairing(
|
|
596
|
+
truthy_assignments={
|
|
597
|
+
# Registration always puts the non-optional call in slot 0.
|
|
598
|
+
key: [(slot[0], slot[1]) for slot in slots if slot[0] is not None]
|
|
599
|
+
for key, slots in self.truthy_assignments.items()
|
|
600
|
+
},
|
|
601
|
+
unconsumed_results=self.unconsumed_results,
|
|
602
|
+
falsy_assignments={
|
|
603
|
+
# Registration always puts the non-optional call in slot 0.
|
|
604
|
+
stream: [(slot[0], slot[1]) for slot in slots if slot[0] is not None]
|
|
605
|
+
for stream, slots in self.falsy_assignments.items()
|
|
606
|
+
},
|
|
607
|
+
falsy_unconsumed_results=self.falsy_unconsumed,
|
|
608
|
+
unpairable_calls=tuple(self.unpairable_calls),
|
|
609
|
+
unpairable_results=tuple(self.unpairable_results),
|
|
610
|
+
eligible_results=EligibleResults(truthy=self.eligible_truthy, falsy=self.eligible_falsy),
|
|
611
|
+
)
|
|
612
|
+
|
|
613
|
+
|
|
614
|
+
def pair_results(
|
|
615
|
+
messages: Sequence[Any],
|
|
616
|
+
exchange: Exchange,
|
|
617
|
+
accessor: MessageAccessor,
|
|
618
|
+
policy: PairingPolicy,
|
|
619
|
+
) -> ExchangePairing:
|
|
620
|
+
"""Pair *exchange*'s results with its calls under one policy row.
|
|
621
|
+
|
|
622
|
+
The walk is message-phased: each response sibling registers its call
|
|
623
|
+
occurrences before its embedded results consume (so a within-message
|
|
624
|
+
reversed pair still pairs, and nothing forward-pairs with a later
|
|
625
|
+
sibling's call); external output consumes against the full accumulated
|
|
626
|
+
exchange in transcript order.
|
|
627
|
+
"""
|
|
628
|
+
state = _PairingState(policy)
|
|
629
|
+
|
|
630
|
+
def occurrence_of(message_index: int, content_index: int, content: Any, content_type: str) -> Occurrence:
|
|
631
|
+
return Occurrence(
|
|
632
|
+
message_index=message_index,
|
|
633
|
+
content_index=content_index,
|
|
634
|
+
raw_id=_normalize_raw_id(accessor.raw_id(content), policy),
|
|
635
|
+
content_type=content_type,
|
|
636
|
+
error_kind=accessor.error_kind(content),
|
|
637
|
+
)
|
|
638
|
+
|
|
639
|
+
for message_index in exchange.response_indices:
|
|
640
|
+
contents = accessor.contents(messages[message_index])
|
|
641
|
+
for content_index, content in enumerate(contents):
|
|
642
|
+
content_type = accessor.content_type(content)
|
|
643
|
+
if content_type not in policy.call_types:
|
|
644
|
+
continue
|
|
645
|
+
if not policy.include_informational_calls and accessor.is_informational(content):
|
|
646
|
+
continue
|
|
647
|
+
state.register_call(occurrence_of(message_index, content_index, content, content_type))
|
|
648
|
+
for content_index, content in enumerate(contents):
|
|
649
|
+
content_type = accessor.content_type(content)
|
|
650
|
+
if content_type in policy.result_types:
|
|
651
|
+
state.consume_result(occurrence_of(message_index, content_index, content, content_type))
|
|
652
|
+
|
|
653
|
+
for message_index in exchange.output_indices:
|
|
654
|
+
for content_index, content in enumerate(accessor.contents(messages[message_index])):
|
|
655
|
+
content_type = accessor.content_type(content)
|
|
656
|
+
if content_type in policy.result_types:
|
|
657
|
+
state.consume_result(occurrence_of(message_index, content_index, content, content_type))
|
|
658
|
+
|
|
659
|
+
return state.finish()
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
__all__ = [
|
|
663
|
+
"LEGACY_CALL_CONTENT_TYPE",
|
|
664
|
+
"PREVALIDATION_ERROR_KINDS",
|
|
665
|
+
"TOOL_CALL_CONTENT_TYPES",
|
|
666
|
+
"TOOL_RESULT_CONTENT_TYPES",
|
|
667
|
+
"DictAccessor",
|
|
668
|
+
"EligibleResults",
|
|
669
|
+
"EmptyIdPolicy",
|
|
670
|
+
"Exchange",
|
|
671
|
+
"ExchangePairing",
|
|
672
|
+
"FalsyStream",
|
|
673
|
+
"LiveAccessor",
|
|
674
|
+
"MessageAccessor",
|
|
675
|
+
"NoneIdPolicy",
|
|
676
|
+
"Occurrence",
|
|
677
|
+
"PairingKey",
|
|
678
|
+
"PairingPolicy",
|
|
679
|
+
"is_result_only_message",
|
|
680
|
+
"iter_exchanges",
|
|
681
|
+
"namespaced_pairing_key",
|
|
682
|
+
"pair_results",
|
|
683
|
+
]
|