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,602 @@
|
|
|
1
|
+
# Hooks 配置参考
|
|
2
|
+
|
|
3
|
+
钩子(Hooks)让 iCode 在指定时机自动运行本地脚本或命令。本页用于查询完整配置字段、默认值、事件数据和执行规则。第一次使用 Hooks 时,建议先阅读[配置和编写 Hooks](../guides/extensions/hooks.md),通过可运行的示例创建和验证钩子。
|
|
4
|
+
|
|
5
|
+
> **安全提示**
|
|
6
|
+
>
|
|
7
|
+
> 钩子直接使用当前用户的权限运行,不经过工具审批,也不受安全沙箱限制。启用项目自带的钩子前,请检查其配置文件以及运行的脚本和命令。
|
|
8
|
+
>
|
|
9
|
+
> 钩子可能接收对话内容、工具参数和工具运行结果。若钩子会将这些数据发送到外部服务,请注意检查其中是否包含敏感信息。
|
|
10
|
+
|
|
11
|
+
## 术语
|
|
12
|
+
|
|
13
|
+
本页将使用以下中文名称:
|
|
14
|
+
|
|
15
|
+
| 中文名称 | 配置值或对象 | 含义 |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| 一轮 | `turn` | iCode 对一次用户请求的处理过程,从开始处理请求,到智能体停止生成内容和调用工具为止。用户中断或运行失败也会结束当前轮;运行期间提交的补充消息仍属于当前轮。 |
|
|
18
|
+
| 事件 | `event` | 触发钩子的时机,例如一轮结束或工具运行前。 |
|
|
19
|
+
| 阻塞式钩子 | `execution.mode: blocking` | iCode 等待钩子结束后再继续;部分事件会采用钩子返回的操作决定。 |
|
|
20
|
+
| 异步钩子 | `execution.mode: async` | iCode 立即继续当前操作,但通常会在当前轮或会话结束前等待钩子完成。 |
|
|
21
|
+
| 即发即弃钩子 | `execution.mode: fire_and_forget` | iCode 立即继续,在当前轮或会话结束时也不等待钩子;这是默认模式。 |
|
|
22
|
+
| 分离运行 | `execution.detach: true` | 让已经启动的即发即弃钩子在 iCode 退出后继续运行。 |
|
|
23
|
+
| 持久投递 | `execution.delivery: durable` | 记录未完成的非阻塞钩子任务,以便 iCode 以后重试;同一任务可能重复运行,脚本应能安全地重复执行。 |
|
|
24
|
+
| 输入文件 | `CHRYS_HOOK_PAYLOAD_FILE` | iCode 为本次事件生成的 JSON 文件,包含事件和上下文数据。 |
|
|
25
|
+
| 结果文件 | `CHRYS_HOOK_RESULT` | 钩子写入操作决定或补充信息的 JSON 文件。只有符合条件的阻塞式钩子能借此改变 iCode 的行为。 |
|
|
26
|
+
|
|
27
|
+
## 配置文件位置
|
|
28
|
+
|
|
29
|
+
iCode 可以分别从全局配置目录和当前工作目录加载一个钩子配置文件:
|
|
30
|
+
|
|
31
|
+
| 范围 | macOS 和 Linux | Windows |
|
|
32
|
+
| --- | --- | --- |
|
|
33
|
+
| 全局 | `~/.chrys/hooks/hooks.yaml` | `%APPDATA%\chrys\hooks\hooks.yaml` |
|
|
34
|
+
| 项目 | `<working-directory>/.chrys/hooks/hooks.yaml` | `<working-directory>\.chrys\hooks\hooks.yaml` |
|
|
35
|
+
|
|
36
|
+
两处都可以改用 `hooks.yml` 或 `hooks.json`。同一目录存在多个候选文件时,iCode 按 `hooks.yaml`、`hooks.yml`、`hooks.json` 的顺序只加载第一个。
|
|
37
|
+
|
|
38
|
+
`<working-directory>` 是会话的工作目录。对于项目配置,iCode 只检查 `<working-directory>/.chrys/hooks/`,不会在工作目录的父目录或子目录中查找。
|
|
39
|
+
|
|
40
|
+
## 加载配置文件
|
|
41
|
+
|
|
42
|
+
项目钩子随你打开的仓库而来,因此默认不加载。如需加载,在终端用户界面(Terminal User Interface,TUI)中按 **F10** 打开“设置”,在“安全”-“项目信任”区域勾选“加载项目钩子”(`project.hooks_enabled`)。工作目录中有未加载的项目钩子时,iCode 会弹出提示。全局钩子始终加载。
|
|
43
|
+
|
|
44
|
+
在磁盘上编辑钩子配置文件不会实时生效。修改后,需要切换会话或重启 iCode,让 iCode 重新加载配置。仅修改钩子脚本则不需要重新加载;脚本会在下次触发钩子时使用新内容。
|
|
45
|
+
|
|
46
|
+
在 TUI 中输入 `/runtime`,打开“钩子”标签页,可以查看当前加载的项目钩子和全局钩子。
|
|
47
|
+
|
|
48
|
+
## 配置文件结构
|
|
49
|
+
|
|
50
|
+
钩子配置文件支持以下顶层字段:
|
|
51
|
+
|
|
52
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
53
|
+
| --- | --- | --- | --- |
|
|
54
|
+
| `version` | 整数 | `1` | 配置格式版本。目前只支持 `1`。 |
|
|
55
|
+
| `settings` | 对象 | 各字段的默认值 | 当前配置文件中所有钩子共用的并发、退出等待和持久投递重试设置。 |
|
|
56
|
+
| `hooks` | 列表 | `[]` | 钩子条目列表。 |
|
|
57
|
+
|
|
58
|
+
`version` 和 `settings` 均可省略;省略时,iCode 使用表中列出的默认值。
|
|
59
|
+
|
|
60
|
+
`hooks` 用于定义钩子;`settings` 用于设置当前配置文件中所有钩子共用的执行参数。
|
|
61
|
+
|
|
62
|
+
### 全局设置
|
|
63
|
+
|
|
64
|
+
需要调整并发数量、退出等待时间或持久投递的重试行为时,可以配置 `settings`:
|
|
65
|
+
|
|
66
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
67
|
+
| --- | --- | --- | --- |
|
|
68
|
+
| `shutdown_grace_seconds` | 数值(>= `0`) | `5.0` | 当前会话结束时(见[会话事件](#会话事件)中的 `session_end`),最多等待异步钩子运行的时间。超时后仍未结束的钩子会被取消。 |
|
|
69
|
+
| `max_parallel_hooks` | 整数(>= `1`) | `4` | 最多同时运行的钩子数。达到上限后,新触发的钩子会等待已有钩子结束。启用分离运行的钩子不受此限制。 |
|
|
70
|
+
| `outbox_retry_age_seconds` | 数值(>= `0`) | `60.0` | 仅用于持久投递钩子。iCode 启动后,会重试因上次退出或崩溃而未记录为完成的钩子任务。此设置指定重试前至少等待的秒数,从任务上次开始执行时算起;任务从未执行过时,则从创建时算起。 |
|
|
71
|
+
| `outbox_max_retries` | 整数(>= `0`) | `3` | 仅用于持久投递钩子。每个钩子任务最多启动的次数,包括首次执行。使用默认值 `3` 时,中断的任务最多重试两次;设为 `1` 时不重试;设为 `0` 时,从未启动的任务也会被记录为失败。 |
|
|
72
|
+
|
|
73
|
+
同时存在项目和全局配置时,`settings` 按字段合并:项目文件中的值优先,其次使用全局文件中的值,两个文件均未设置时使用默认值。
|
|
74
|
+
|
|
75
|
+
### 定义钩子
|
|
76
|
+
|
|
77
|
+
`hooks` 列表中的每一项定义一个钩子,支持以下字段:
|
|
78
|
+
|
|
79
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
80
|
+
| --- | --- | --- | --- |
|
|
81
|
+
| `id` | 字符串 | 必填 | 钩子的稳定标识。首尾空白会被删除,删除后长度必须为 `1` 到 `512` 个字符。同一文件内不能重复。 |
|
|
82
|
+
| `event` | 字符串 | 必填 | 何时运行钩子,可用值见[事件](#事件)。 |
|
|
83
|
+
| `run` | 对象 | 必填 | 要启动的脚本、命令或 Shell 片段。 |
|
|
84
|
+
| `execution` | 对象 | 见[执行方式](#执行方式) | iCode 是否等待钩子、运行时限和失败处理方式。 |
|
|
85
|
+
| `match` | 对象 | 无筛选条件 | 限制哪些智能体或工具调用会触发该钩子。 |
|
|
86
|
+
| `enabled` | 布尔值 | `true` | 设为 `false` 可停用该钩子而不删除配置。 |
|
|
87
|
+
| `description` | 字符串 | `""` | 该钩子的说明,便于识别;不改变运行行为。 |
|
|
88
|
+
|
|
89
|
+
`id` 可以包含中文、空格和特殊符号,但不能包含换行符、制表符或其他无法正常显示的字符。`id` 包含空格或特殊符号时,应使用引号包住整个值。项目配置和全局配置可以使用相同的 `id`,两条钩子都会运行。
|
|
90
|
+
|
|
91
|
+
## 事件
|
|
92
|
+
|
|
93
|
+
通过 `event` 指定钩子在哪种事件发生时运行。
|
|
94
|
+
|
|
95
|
+
所有事件都提供[基础字段](#基础字段),部分事件还会提供各自的额外字段,具体见下文。
|
|
96
|
+
|
|
97
|
+
### 会话事件
|
|
98
|
+
|
|
99
|
+
| 事件 | 运行时机 | 额外字段 |
|
|
100
|
+
| --- | --- | --- |
|
|
101
|
+
| `session_start` | 智能体准备就绪后。启动 iCode、新建会话或将当前会话回滚到开始处时会触发;切换智能体或模型不会触发。 | 无 |
|
|
102
|
+
| `session_restored` | 已保存的会话恢复后。启动 iCode 后立即恢复会话时,`session_start` 和 `session_restored` 都可能触发。 | `restored_session_id`:本次恢复的已保存会话 ID |
|
|
103
|
+
| `session_end` | 当前会话结束时:退出 iCode、切换会话、新建会话、删除或清空当前会话,或将当前会话回滚到开始处。 | 无 |
|
|
104
|
+
|
|
105
|
+
### 轮次事件
|
|
106
|
+
|
|
107
|
+
| 事件 | 运行时机 | 额外字段 |
|
|
108
|
+
| --- | --- | --- |
|
|
109
|
+
| `before_turn` | 一轮开始前。 | `turn`:从 `1` 开始的轮次编号<br>`user_text`:当前轮使用的用户文本<br>`is_retry`:是否正在重试同一轮 |
|
|
110
|
+
| `after_turn` | 一轮结束后,包括正常完成、用户中断和运行失败。 | `turn`:从 `1` 开始的轮次编号<br>`status`:`ok`、`interrupted` 或 `failed`<br>`failed`:本轮是否未正常完成,运行失败或被中断时均为 `true` |
|
|
111
|
+
|
|
112
|
+
### 用户操作事件
|
|
113
|
+
|
|
114
|
+
| 事件 | 运行时机 | 额外字段 |
|
|
115
|
+
| --- | --- | --- |
|
|
116
|
+
| `user_prompt_submit` | 用户提交开始新一轮的消息,或在智能体运行期间提交补充消息时。 | `text`:用户刚提交的消息文本<br>`injected`:`true` 表示运行期间提交的补充消息,`false` 表示开始新一轮的消息 |
|
|
117
|
+
| `user_interrupt` | 用户中断当前轮后。 | 无 |
|
|
118
|
+
|
|
119
|
+
### 工具事件
|
|
120
|
+
|
|
121
|
+
`tool` 和 `result` 对象的字段见[工具事件字段](#工具事件字段)。
|
|
122
|
+
|
|
123
|
+
| 事件 | 运行时机 | 额外字段 |
|
|
124
|
+
| --- | --- | --- |
|
|
125
|
+
| `before_tool_call` | 工具进入审批和执行流程前。如果用户在审批时编辑了参数,该钩子会在工具运行前使用编辑后的参数再次运行。 | `tool`:工具名称、类别、调用 ID 和参数 |
|
|
126
|
+
| `after_tool_call` | 工具调用返回后。工具正常返回结果、返回失败结果、因审批未通过而未执行,或被 `before_tool_call` 钩子拒绝时都会触发。 | `tool`:工具调用<br>`result`:运行结果 |
|
|
127
|
+
| `tool_error` | 工具调用抛出运行错误后。同一次调用会先触发 `after_tool_call`,再触发 `tool_error`。 | `tool`:工具调用<br>`result`:运行结果,其中 `result.error` 为 `true` |
|
|
128
|
+
|
|
129
|
+
### 审批事件
|
|
130
|
+
|
|
131
|
+
审批事件用于通知或记录工具审批的人工等待状态,仅覆盖 iCode 处理的工具审批,不覆盖外部 ACP 智能体转发的审批。字段格式见[审批事件字段](#审批事件字段)。
|
|
132
|
+
|
|
133
|
+
| 事件 | 运行时机 | 额外字段 |
|
|
134
|
+
| --- | --- | --- |
|
|
135
|
+
| `approval_requested` | 工具审批进入人工等待时。 | `request_id`、`caller_name`、`tool` |
|
|
136
|
+
| `approval_resolved` | 人工同意或拒绝审批后,iCode 继续处理审批结果前;等待被中断时不触发,不表示工具已经执行或执行成功。 | 与 `approval_requested` 相同,另有 `approved` |
|
|
137
|
+
|
|
138
|
+
在自动审批模式(`auto`)下,iCode 先完成自动审查,仅在仍需人工决定时触发审批事件。自动审查直接通过、审批被绕过,或进入等待前已经获得审批决定时,均不触发。
|
|
139
|
+
|
|
140
|
+
这两个事件的钩子只能观察审批状态,不能通过结果文件批准、拒绝或修改审批决定。
|
|
141
|
+
|
|
142
|
+
### 子智能体事件
|
|
143
|
+
|
|
144
|
+
| 事件 | 运行时机 | 额外字段 |
|
|
145
|
+
| --- | --- | --- |
|
|
146
|
+
| `sub_agent_start` | 子智能体调用开始时。 | `sub_agent`:显示名称 `name`、工具名称 `tool_name`、调用标识 `invocation_id`,以及父级调用标识 `parent_call_id` 和 `parent_provider_call_id` |
|
|
147
|
+
| `sub_agent_end` | 子智能体调用结束时。 | `sub_agent`:与 `sub_agent_start` 相同<br>`status`:`ok`、`failed` 或 `cancelled`<br>`result_summary`:最长 500 个字符的结果摘要 |
|
|
148
|
+
|
|
149
|
+
### 上下文压缩事件
|
|
150
|
+
|
|
151
|
+
| 事件 | 运行时机 | 额外字段 |
|
|
152
|
+
| --- | --- | --- |
|
|
153
|
+
| `pre_compact` | 上下文即将压缩时。 | `trigger`:压缩阶段或触发原因,取值见下表<br>`usage_pct`:压缩前的上下文使用比例,以 `1` 表示 100%<br>`tokens_before`:压缩前的 token 数<br>`sub_agent`:仅在子智能体压缩时提供,包含显示名称 `name` 和工具名称 `tool_name` |
|
|
154
|
+
|
|
155
|
+
`trigger` 的取值如下:
|
|
156
|
+
|
|
157
|
+
| 值 | 含义 |
|
|
158
|
+
| --- | --- |
|
|
159
|
+
| `phase1` | 缩减较早的工具结果。 |
|
|
160
|
+
| `phase2` | 移除较早的工具调用及其结果。 |
|
|
161
|
+
| `phase3` | 用摘要代替已完成的较早轮次。 |
|
|
162
|
+
| `phase4` | 生成用于续接当前任务的 Last Words,并缩减当前轮内容。 |
|
|
163
|
+
| `force` | 强制压缩。 |
|
|
164
|
+
|
|
165
|
+
### 工作流事件
|
|
166
|
+
|
|
167
|
+
| 事件 | 运行时机 | 额外字段 |
|
|
168
|
+
| --- | --- | --- |
|
|
169
|
+
| `workflow_run_start` | 工作流运行通过启动检查后、执行节点前。 | `run_id`、`input_text` |
|
|
170
|
+
| `workflow_run_end` | 工作流运行结束后,包括失败和取消。 | `run_id`、`outcome`、`reason` |
|
|
171
|
+
|
|
172
|
+
这两个事件只在工作流会话中触发,用于通知和记录;`action: block` 会被忽略。会话事件在工作流会话中也会触发,但触发时机不同。详见工作流参考中的[生命周期 Hooks](./workflows.md#生命周期-hooks)。
|
|
173
|
+
|
|
174
|
+
### 阻塞式钩子的影响
|
|
175
|
+
|
|
176
|
+
只有以下事件会采用阻塞式钩子在结果文件中返回的操作决定:
|
|
177
|
+
|
|
178
|
+
| 事件 | 影响 |
|
|
179
|
+
| --- | --- |
|
|
180
|
+
| `user_prompt_submit` | 拒绝消息或添加系统提醒。 |
|
|
181
|
+
| `before_tool_call` | 拒绝工具调用或修改参数,但不能批准调用或绕过审批。 |
|
|
182
|
+
| `after_tool_call` | 向工具结果追加上下文,但不能撤销已经发生的调用。 |
|
|
183
|
+
| `tool_error` | 向工具错误追加上下文,但不能撤销已经发生的调用。 |
|
|
184
|
+
|
|
185
|
+
### 异步钩子的等待时机
|
|
186
|
+
|
|
187
|
+
异步钩子触发后立即运行,当前操作会继续执行。如果钩子尚未完成,iCode 会在以下时机等待:
|
|
188
|
+
|
|
189
|
+
- 当前轮结束时,等待本轮触发的异步钩子;`user_interrupt` 触发的钩子除外。
|
|
190
|
+
- 当前会话结束时,等待会话事件触发的异步钩子。`session_end` 在会话结束阶段触发,因此会立即进入等待。
|
|
191
|
+
|
|
192
|
+
会话结束时的等待受 `shutdown_grace_seconds` 限制。每个异步钩子本身还受 `timeout_seconds` 限制。
|
|
193
|
+
|
|
194
|
+
## 匹配条件
|
|
195
|
+
|
|
196
|
+
`event` 决定钩子监听哪种事件,`match` 进一步限定哪些事件会触发钩子。省略 `match` 或设置为 `{}` 时,不增加筛选条件;设置多个条件时,事件必须同时满足这些条件。
|
|
197
|
+
|
|
198
|
+
| 字段 | 类型 | 适用事件 | 匹配要求 |
|
|
199
|
+
| --- | --- | --- | --- |
|
|
200
|
+
| `profile` | 字符串 | 所有事件 | 事件所属的智能体名称(基础字段 `profile`)等于指定值。 |
|
|
201
|
+
| `profiles` | 字符串列表 | 所有事件 | 事件所属的智能体名称是列表中的一项;空列表不限制智能体名称。 |
|
|
202
|
+
| `tool_kind` | 字符串 | 工具、审批事件 | 工具类别等于指定值。 |
|
|
203
|
+
| `tool_name` | 字符串 | 工具、审批事件 | 工具名称等于指定值。 |
|
|
204
|
+
| `args` | 对象 | 工具、审批事件 | 工具参数满足指定条件,见[工具参数匹配](#工具参数匹配)。 |
|
|
205
|
+
|
|
206
|
+
`profile` 和 `profiles` 通常只需设置一个;同时设置时,两者都必须满足。对于子智能体事件,以及子智能体内部的工具、审批和上下文压缩事件,智能体名称是子智能体的配置名称,而不是主智能体的名称。
|
|
207
|
+
|
|
208
|
+
其他事件不提供 `tool` 对象,无法满足工具类别、名称或具体参数的筛选条件。工具类别的可用值及对应工具名称见[工具类别和名称](./tool-kinds-and-names.md)。
|
|
209
|
+
|
|
210
|
+
### 工具参数匹配
|
|
211
|
+
|
|
212
|
+
`args` 以工具实际定义的参数名为键,每个参数下配置比较条件。例如,以下片段要求工具的 `path` 参数同时包含 `src/`,并以 `.py` 结尾:
|
|
213
|
+
|
|
214
|
+
```yaml
|
|
215
|
+
match:
|
|
216
|
+
args:
|
|
217
|
+
path:
|
|
218
|
+
contains: "src/"
|
|
219
|
+
regex: '\.py$'
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
| 运算符 | 匹配要求 | 示例 |
|
|
223
|
+
| --- | --- | --- |
|
|
224
|
+
| `equals` | 参数的完整字符串与指定值相同。 | `equals: "README.md"` |
|
|
225
|
+
| `contains` | 参数的字符串包含指定片段。 | `contains: "src/"` |
|
|
226
|
+
| `regex` | 参数的字符串中存在符合 Python 正则表达式的部分。 | `regex: '\.py$'` |
|
|
227
|
+
|
|
228
|
+
匹配时遵循以下规则:
|
|
229
|
+
|
|
230
|
+
- 指定多个参数,或为同一参数设置多个运算符时,所有条件都必须满足。`args: {}` 不增加参数筛选条件。
|
|
231
|
+
- 参数缺失或值为 `null` 时不匹配。`path: {}` 只检查 `path` 存在且不为 `null`,不比较具体值。
|
|
232
|
+
- 条件值必须是字符串。在 YAML 中,数字和布尔值需要加引号:未加引号的值(如 `equals: 10` 或 `equals: true`)属于配置错误,会导致该文件中的所有钩子被停用。
|
|
233
|
+
- 非字符串参数会先用 Python 的 `str()` 转换再比较,因此 JSON 的 `true` 和 `false` 会变成 `True` 和 `False`(应写 `equals: "True"` 进行匹配),列表和对象使用 Python 的表示形式。
|
|
234
|
+
- 正则表达式建议使用 YAML 单引号字符串;使用双引号时,反斜杠需要转义。正则表达式无效的钩子会在会话启动时被跳过,并显示一条注明该钩子和所在文件的警告;该文件中的其他钩子仍会运行。
|
|
235
|
+
|
|
236
|
+
## 运行配置
|
|
237
|
+
|
|
238
|
+
`run` 指定钩子要启动的脚本或命令。先通过 `type` 选择一种运行方式:
|
|
239
|
+
|
|
240
|
+
| `type` | 适用情况 | 必填字段 |
|
|
241
|
+
| --- | --- | --- |
|
|
242
|
+
| `script` | 运行已有脚本,并由 iCode 根据文件扩展名选择运行程序。 | `path` |
|
|
243
|
+
| `command` | 直接启动一个可执行文件,不需要 Shell 解释。 | `argv` |
|
|
244
|
+
| `shell` | 运行包含重定向、管道、变量展开等 Shell 语法的命令字符串。 | `shell` |
|
|
245
|
+
|
|
246
|
+
只填写所选类型对应的 `path`、`argv` 或 `shell`。三种类型都可以[设置环境变量和工作目录](#设置环境变量和工作目录)。
|
|
247
|
+
|
|
248
|
+
### 运行脚本
|
|
249
|
+
|
|
250
|
+
使用 `script` 运行磁盘上的脚本文件。例如,运行钩子配置文件所在目录下的 `scripts/check.py` 并传入 `--strict` 参数:
|
|
251
|
+
|
|
252
|
+
```yaml
|
|
253
|
+
run:
|
|
254
|
+
type: script
|
|
255
|
+
path: scripts/check.py
|
|
256
|
+
args: ["--strict"]
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
260
|
+
| --- | --- | --- | --- |
|
|
261
|
+
| `type` | `script` | 必填 | 固定填写 `script`。 |
|
|
262
|
+
| `path` | 字符串 | 必填 | 脚本文件路径。可以使用绝对路径;相对路径以当前钩子配置文件所在目录为基准。 |
|
|
263
|
+
| `args` | 字符串列表 | `[]` | 传给脚本的参数,按顺序追加在脚本路径后。 |
|
|
264
|
+
|
|
265
|
+
iCode 根据文件扩展名选择运行程序:
|
|
266
|
+
|
|
267
|
+
| 扩展名 | 运行程序 |
|
|
268
|
+
| --- | --- |
|
|
269
|
+
| `.py` | 按下文说明选择 `uv` 或 Python |
|
|
270
|
+
| `.ps1` | `pwsh` 或 `powershell` |
|
|
271
|
+
| `.sh`、`.bash`、`.zsh` | `bash` 或 `sh`;Windows 还会查找 Git Bash |
|
|
272
|
+
| `.js`、`.mjs` | `node` |
|
|
273
|
+
| `.ts` | `npx tsx` |
|
|
274
|
+
| `.rb` | `ruby` |
|
|
275
|
+
| `.pl` | `perl` |
|
|
276
|
+
| 其他 | 按 Python 脚本运行 |
|
|
277
|
+
|
|
278
|
+
对于 `.py` 文件,iCode 会先在用户的 `PATH` 中依次查找 `uv`、`python3` 和 `python`。找到 `uv` 时,通过 `uv run` 运行脚本;找到 Python 时,直接使用该解释器。如果都未找到,则使用 iCode 自带运行环境中的 `uv` 或 Python。
|
|
279
|
+
|
|
280
|
+
运行其他类型的脚本前,需安装表中对应的运行程序,并确保 iCode 可以通过 `PATH` 找到该程序。
|
|
281
|
+
|
|
282
|
+
### 运行命令
|
|
283
|
+
|
|
284
|
+
使用 `command` 直接启动可执行文件。例如,运行 `git status --short`:
|
|
285
|
+
|
|
286
|
+
```yaml
|
|
287
|
+
run:
|
|
288
|
+
type: command
|
|
289
|
+
argv: ["git", "status", "--short"]
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
iCode 不会通过 Shell 解释参数,因此重定向、管道、变量展开和命令替换不会生效。
|
|
293
|
+
|
|
294
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
295
|
+
| --- | --- | --- | --- |
|
|
296
|
+
| `type` | `command` | 必填 | 固定填写 `command`。 |
|
|
297
|
+
| `argv` | 字符串列表 | 必填 | 要启动的可执行文件及其固定参数。列表不能为空,第一项是可执行文件。 |
|
|
298
|
+
| `args` | 字符串列表 | `[]` | 追加到 `argv` 末尾的参数。 |
|
|
299
|
+
|
|
300
|
+
每个参数应作为一个独立的列表元素填写,不需要添加 Shell 转义。可以将全部参数写入 `argv`,也可以将末尾参数写入 `args`;两种写法的运行结果相同。不依赖 Shell 语法时,优先使用 `command`,可以避免不同 Shell 的引用和转义差异。
|
|
301
|
+
|
|
302
|
+
### 运行 Shell 片段
|
|
303
|
+
|
|
304
|
+
使用 `shell` 运行一个完整的 Shell 命令字符串。例如,下面的配置把一行文字追加到工作目录的 `hook-events.log`:
|
|
305
|
+
|
|
306
|
+
```yaml
|
|
307
|
+
run:
|
|
308
|
+
type: shell
|
|
309
|
+
shell: "echo hook triggered >> hook-events.log"
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
313
|
+
| --- | --- | --- | --- |
|
|
314
|
+
| `type` | `shell` | 必填 | 固定填写 `shell`。 |
|
|
315
|
+
| `shell` | 字符串 | 必填 | 交给 Shell 解释的完整命令字符串。 |
|
|
316
|
+
|
|
317
|
+
在 macOS 和 Linux 上,iCode 使用环境变量 `$SHELL` 指定的 Shell;未设置时使用 `/bin/sh`。在 Windows 上使用命令提示符(CMD)。不同 Shell 支持的语法可能不同。
|
|
318
|
+
|
|
319
|
+
整个命令由 Shell 解释。不要把不可信内容直接拼接到 `shell` 字符串中,否则可能造成命令注入。`shell` 类型不使用 `args`;需要传入额外内容时,应直接写入 `shell` 字符串,或改用 `script`、`command`。
|
|
320
|
+
|
|
321
|
+
### 设置环境变量和工作目录
|
|
322
|
+
|
|
323
|
+
`env` 和 `cwd` 适用于 `script`、`command` 和 `shell` 三种类型。
|
|
324
|
+
|
|
325
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
326
|
+
| --- | --- | --- | --- |
|
|
327
|
+
| `env` | 字符串到字符串的对象 | `{}` | 添加到钩子进程的环境变量;名称相同时,覆盖 iCode 传递的值。 |
|
|
328
|
+
| `cwd` | 字符串 | `""` | 钩子进程的工作目录;省略或留空时使用当前会话的工作目录。 |
|
|
329
|
+
|
|
330
|
+
例如,为脚本设置环境变量,并在当前会话的工作目录中运行:
|
|
331
|
+
|
|
332
|
+
```yaml
|
|
333
|
+
run:
|
|
334
|
+
type: script
|
|
335
|
+
path: scripts/check.py
|
|
336
|
+
env:
|
|
337
|
+
CHECK_LEVEL: strict
|
|
338
|
+
SESSION_NAME: "${session_id}"
|
|
339
|
+
cwd: "${workspace_cwd}"
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
脚本路径和运行工作目录使用不同的路径基准:
|
|
343
|
+
|
|
344
|
+
| 配置 | 路径基准 |
|
|
345
|
+
| --- | --- |
|
|
346
|
+
| `path` 使用相对路径 | 钩子配置文件所在目录 |
|
|
347
|
+
| `cwd` 省略或留空 | 当前会话的工作目录 |
|
|
348
|
+
| `cwd` 使用相对路径 | iCode 进程的当前工作目录,可能与会话工作目录不同 |
|
|
349
|
+
|
|
350
|
+
设置 `cwd` 时,应使用绝对路径或 `${workspace_cwd}`、`${chrys_home}` 模板,例如用 `${chrys_home}/hooks` 指定 iCode 配置目录下的 `hooks` 目录;目标目录必须存在。
|
|
351
|
+
|
|
352
|
+
`env` 的值和 `cwd` 支持以下模板:
|
|
353
|
+
|
|
354
|
+
| 模板 | 值 |
|
|
355
|
+
| --- | --- |
|
|
356
|
+
| `${workspace_cwd}` | 当前会话的工作目录 |
|
|
357
|
+
| `${chrys_home}` | iCode 配置目录;通常为 `~/.chrys` 或 `%APPDATA%\chrys` |
|
|
358
|
+
| `${session_id}` | 当前会话 ID |
|
|
359
|
+
| `${profile}` | 事件所属的智能体名称,与基础字段 `profile` 相同 |
|
|
360
|
+
|
|
361
|
+
iCode 会按字面量替换 `env` 值和 `cwd` 中出现的上述模板。其他变量或表达式(如 `~`、`$VAR`、`${VAR}` 和 `${VAR:-default}`)不会由 iCode 展开。
|
|
362
|
+
|
|
363
|
+
## 执行方式
|
|
364
|
+
|
|
365
|
+
`execution` 控制 iCode 是否等待钩子、钩子能否在 iCode 退出后继续运行、未完成的任务是否重试,以及超时和失败的处理方式。所有字段都可以省略。多数通知和记录脚本使用默认值即可:当前操作不等待钩子,钩子最多运行 30 秒,失败时记录警告。
|
|
366
|
+
|
|
367
|
+
配置时,先选择 `mode`,再按需要设置其他字段。
|
|
368
|
+
|
|
369
|
+
### 选择运行模式
|
|
370
|
+
|
|
371
|
+
先根据钩子是否必须在当前操作继续前完成,选择 `mode`:
|
|
372
|
+
|
|
373
|
+
| `mode` | 等待方式 | 适用情况 | 是否可能影响当前操作 |
|
|
374
|
+
| --- | --- | --- | --- |
|
|
375
|
+
| `blocking` | 先等待钩子结束,再继续处理当前操作;多个 `blocking` 钩子按配置顺序运行 | 操作继续前必须完成的检查,或需要拒绝、修改操作 | 部分事件可以,见[结果文件](#结果文件) |
|
|
376
|
+
| `async` | 当前操作立即继续;后续等待规则见[异步钩子的等待时机](#异步钩子的等待时机) | 不应延迟当前操作,但需要在本轮或当前会话结束前完成的通知和记录 | 否 |
|
|
377
|
+
| `fire_and_forget`(默认) | 当前操作立即继续;本轮或当前会话结束时不等待钩子 | 允许尚未完成的通知和记录被 iCode 退出打断 | 否 |
|
|
378
|
+
|
|
379
|
+
### 设置运行时限和失败处理
|
|
380
|
+
|
|
381
|
+
| 字段 | 类型或可用值 | 默认值 | 说明 |
|
|
382
|
+
| --- | --- | --- | --- |
|
|
383
|
+
| `timeout_seconds` | 大于 `0` 的数值 | `30.0` | 钩子的最长运行时间,单位为秒;启用 `detach` 时忽略。 |
|
|
384
|
+
| `on_error` | `block`、`warn` 或 `ignore` | `warn` | 钩子失败后的处理方式,具体行为见下表。 |
|
|
385
|
+
|
|
386
|
+
`on_error` 决定钩子无法启动、运行超时或返回非零退出码时,iCode 如何继续:
|
|
387
|
+
|
|
388
|
+
| 值 | 行为 |
|
|
389
|
+
| --- | --- |
|
|
390
|
+
| `block` | 对 `user_prompt_submit` 或 `before_tool_call` 的阻塞式钩子,拒绝当前操作并向用户显示错误;其他事件或非阻塞模式按 `warn` 处理。 |
|
|
391
|
+
| `warn` | 记录警告并继续当前操作。 |
|
|
392
|
+
| `ignore` | 仅以调试级别记录失败并继续当前操作。钩子超时或被停止时仍会记录警告。 |
|
|
393
|
+
|
|
394
|
+
阻塞式钩子失败时,iCode 不采用脚本返回的操作决定,只应用 `on_error`。
|
|
395
|
+
|
|
396
|
+
例如,需要在工具运行前完成检查,并在脚本无法启动、超时或返回非零退出码时拒绝调用,可以设置:
|
|
397
|
+
|
|
398
|
+
```yaml
|
|
399
|
+
execution:
|
|
400
|
+
mode: blocking
|
|
401
|
+
timeout_seconds: 5
|
|
402
|
+
on_error: block
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### 退出后继续运行
|
|
406
|
+
|
|
407
|
+
`detach` 是布尔值,默认为 `false`。需要已启动的钩子在 iCode 退出后继续运行时,可以设为 `true`,但只能用于 `mode: fire_and_forget`。
|
|
408
|
+
|
|
409
|
+
启用 `detach` 后,钩子不受 `max_parallel_hooks` 和 `timeout_seconds` 限制。标准输出和标准错误保存在 `~/.chrys/hooks/logs`(macOS 和 Linux)或 `%APPDATA%\chrys\hooks\logs`(Windows)。
|
|
410
|
+
|
|
411
|
+
### 重试未完成的任务
|
|
412
|
+
|
|
413
|
+
`delivery` 控制 iCode 是否在以后启动时重试未完成的任务:
|
|
414
|
+
|
|
415
|
+
| 值 | 行为 |
|
|
416
|
+
| --- | --- |
|
|
417
|
+
| `best_effort`(默认) | 不重试。 |
|
|
418
|
+
| `durable` | 记录待完成的任务,在 iCode 启动时重试符合条件的未完成任务。仅适用于 `async` 和 `fire_and_forget`。 |
|
|
419
|
+
|
|
420
|
+
已经记录为失败的任务不会自动重试,例如脚本返回非零退出码或运行超时。同一任务可能重复运行,因此脚本必须能安全地重复执行。
|
|
421
|
+
|
|
422
|
+
重试条件由[全局设置](#全局设置)控制:`outbox_retry_age_seconds` 指定重试前至少等待多久,`outbox_max_retries` 限制每个任务最多启动多少次。为 `blocking` 设置 `delivery: durable` 不会自动重试,还会产生警告。
|
|
423
|
+
|
|
424
|
+
`detach` 让已启动的进程在 iCode 退出后继续运行,`delivery` 让 iCode 在以后启动时恢复未完成的任务,两者可以同时设置。例如:
|
|
425
|
+
|
|
426
|
+
```yaml
|
|
427
|
+
execution:
|
|
428
|
+
mode: fire_and_forget
|
|
429
|
+
detach: true
|
|
430
|
+
delivery: durable
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
## 脚本输入与输出
|
|
434
|
+
|
|
435
|
+
脚本通过环境变量找到本次钩子的输入和结果文件:
|
|
436
|
+
|
|
437
|
+
| 环境变量 | 说明 |
|
|
438
|
+
| --- | --- |
|
|
439
|
+
| `CHRYS_HOOK_ID` | 当前条目的 `id`。 |
|
|
440
|
+
| `CHRYS_HOOK_EVENT` | 当前事件名称。 |
|
|
441
|
+
| `CHRYS_HOOK_PAYLOAD_FILE` | 包含本次事件信息的 UTF-8 JSON 文件路径。 |
|
|
442
|
+
| `CHRYS_HOOK_RESULT` | 钩子可以写入的 UTF-8 JSON 结果文件路径;文件初始为空。 |
|
|
443
|
+
| `PYTHONUTF8` | 固定为 `1`。 |
|
|
444
|
+
| `PYTHONIOENCODING` | 固定为 `utf-8`。 |
|
|
445
|
+
|
|
446
|
+
每次运行钩子时,iCode 都会提供输入文件和结果文件。两个文件会在钩子结束后删除,不应保存其路径供以后使用。
|
|
447
|
+
|
|
448
|
+
脚本从输入文件读取事件信息,需要返回操作决定时写入[结果文件](#结果文件)。标准输出和标准错误不作为操作决定读取;iCode 对两者各最多保留 256 KiB(开头和结尾)。启用 `detach` 的钩子写入日志文件的输出不受此限制。
|
|
449
|
+
|
|
450
|
+
### 基础字段
|
|
451
|
+
|
|
452
|
+
每个输入文件都包含以下字段:
|
|
453
|
+
|
|
454
|
+
| 字段 | 含义 |
|
|
455
|
+
| --- | --- |
|
|
456
|
+
| `schema` | 输入数据的格式版本,当前为 `1`。 |
|
|
457
|
+
| `event` | 本次触发的事件名称。 |
|
|
458
|
+
| `timestamp` | 事件时间,使用 UTC。 |
|
|
459
|
+
| `session_id` | 当前会话的 ID。 |
|
|
460
|
+
| `profile` | 当前智能体的名称,例如 `Code`。对于子智能体事件,以及子智能体内部的工具、审批和上下文压缩事件,此字段是子智能体的配置名称。 |
|
|
461
|
+
| `cwd` | 当前会话的工作目录。`run.cwd` 设置的是钩子进程的工作目录,不会改变此字段。 |
|
|
462
|
+
|
|
463
|
+
例如,一次工具调用前的输入包含以下基础字段:
|
|
464
|
+
|
|
465
|
+
```json
|
|
466
|
+
{
|
|
467
|
+
"schema": 1,
|
|
468
|
+
"event": "before_tool_call",
|
|
469
|
+
"timestamp": "2026-05-14T15:00:00Z",
|
|
470
|
+
"session_id": "abc-123",
|
|
471
|
+
"profile": "Code",
|
|
472
|
+
"cwd": "/path/to/working-directory"
|
|
473
|
+
}
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
不同事件还会包含各自的额外字段,具体见[事件](#事件)章节。
|
|
477
|
+
|
|
478
|
+
### 工具事件字段
|
|
479
|
+
|
|
480
|
+
以下对象只展示工具事件新增的字段:
|
|
481
|
+
|
|
482
|
+
```json
|
|
483
|
+
{
|
|
484
|
+
"tool": {
|
|
485
|
+
"name": "edit_file",
|
|
486
|
+
"kind": "filesystem.write",
|
|
487
|
+
"call_id": "abcdef123456",
|
|
488
|
+
"args": {
|
|
489
|
+
"path": "src/example.py",
|
|
490
|
+
"old_string": "old",
|
|
491
|
+
"new_string": "new"
|
|
492
|
+
}
|
|
493
|
+
},
|
|
494
|
+
"result": {
|
|
495
|
+
"text": "OK",
|
|
496
|
+
"duration_ms": 42,
|
|
497
|
+
"error": false,
|
|
498
|
+
"failed": false,
|
|
499
|
+
"approval_rejected": false
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
`before_tool_call` 没有 `result`。`after_tool_call` 和 `tool_error` 包含 `result`,其中的状态字段含义如下:
|
|
505
|
+
|
|
506
|
+
| 字段 | 出现条件与含义 |
|
|
507
|
+
| --- | --- |
|
|
508
|
+
| `error` | 工具调用抛出异常时为 `true`;正常返回失败结果或调用被拒绝时为 `false`。 |
|
|
509
|
+
| `failed` | 调用被判定为失败时为 `true`,包括抛出异常、返回可识别的失败结果(例如 Shell 命令返回非零退出码),或调用被拒绝。 |
|
|
510
|
+
| `approval_rejected` | 始终存在;调用被用户或钩子拒绝时为 `true`,否则为 `false`。 |
|
|
511
|
+
| `rejection_source` | 仅在调用被拒绝时出现;`user` 表示用户拒绝,`hook` 表示钩子拒绝。 |
|
|
512
|
+
| `hook_denied` | 仅在调用被拒绝时出现;钩子拒绝时为 `true`,用户拒绝时为 `false`。 |
|
|
513
|
+
|
|
514
|
+
`error: true` 时,`failed` 也为 `true`,但 `failed: true` 不一定表示抛出了异常。`tool_error` 只在抛出异常时触发;需要检查各类失败时,应监听 `after_tool_call` 并检查 `result.failed`。
|
|
515
|
+
|
|
516
|
+
### 审批事件字段
|
|
517
|
+
|
|
518
|
+
以下对象展示 `approval_resolved` 在基础字段之外提供的内容:
|
|
519
|
+
|
|
520
|
+
```json
|
|
521
|
+
{
|
|
522
|
+
"request_id": "approval-123",
|
|
523
|
+
"caller_name": "Code",
|
|
524
|
+
"tool": {
|
|
525
|
+
"name": "edit_file",
|
|
526
|
+
"kind": "filesystem.write",
|
|
527
|
+
"call_id": "call-456",
|
|
528
|
+
"args": {
|
|
529
|
+
"path": "src/example.py",
|
|
530
|
+
"old_string": "old",
|
|
531
|
+
"new_string": "new"
|
|
532
|
+
}
|
|
533
|
+
},
|
|
534
|
+
"approved": true
|
|
535
|
+
}
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
| 字段 | 含义 |
|
|
539
|
+
| --- | --- |
|
|
540
|
+
| `request_id` | 本次审批请求的标识;同一次等待的开始和结束事件使用相同值。 |
|
|
541
|
+
| `caller_name` | 发起工具调用的智能体显示名称;未配置显示名称时使用配置名称。 |
|
|
542
|
+
| `tool` | 进入人工等待时的工具名称、类别、调用 ID 和参数。人工审批时编辑的参数不会更新此处的 `args`,因此该字段不一定是最终执行参数。 |
|
|
543
|
+
| `approved` | 仅在 `approval_resolved` 中出现;`true` 表示同意,`false` 表示拒绝。 |
|
|
544
|
+
|
|
545
|
+
审批事件的基础字段 `profile` 是发起调用的智能体配置名称,可能与 `caller_name` 不同。
|
|
546
|
+
|
|
547
|
+
## 结果文件
|
|
548
|
+
|
|
549
|
+
向 `CHRYS_HOOK_RESULT` 指定的文件写入 UTF-8 JSON 对象,即可返回操作决定。文件最大为 1 MiB。
|
|
550
|
+
|
|
551
|
+
只有阻塞式钩子成功返回退出码 `0` 时,iCode 才会按下表所列的事件和条件采用操作决定。异步和即发即弃钩子的结果文件不会改变 iCode 行为。钩子无法启动、运行超时或返回非零退出码时,结果文件会被忽略,并按[失败处理配置](#设置运行时限和失败处理)中的 `on_error` 处理。
|
|
552
|
+
|
|
553
|
+
结果文件支持以下 JSON 字段:
|
|
554
|
+
|
|
555
|
+
| 字段 | 类型 | 生效事件与条件 | 说明 |
|
|
556
|
+
| --- | --- | --- | --- |
|
|
557
|
+
| `action` | `allow`、`block` 或 `modify` | `user_prompt_submit`、`before_tool_call` | 默认为 `allow`。两种事件都接受 `block`;只有 `before_tool_call` 接受 `modify`。 |
|
|
558
|
+
| `reason` | 字符串 | `user_prompt_submit`、`before_tool_call`,且 `action: block` | 向用户显示的拒绝原因;工具调用被拒绝时,也会提供给模型。 |
|
|
559
|
+
| `args_override` | 对象 | `before_tool_call` 且 `action: modify` | 将其中的顶层字段加入现有 `tool.args`。同名字段会替换原值;如果值是对象,该对象也会被整体替换。 |
|
|
560
|
+
| `system_reminder` | 字符串 | `user_prompt_submit` | 作为系统提醒加入当前轮的每一次模型调用。 |
|
|
561
|
+
| `extra_context` | 字符串 | `after_tool_call`、`tool_error` | 追加到工具结果文本,不能撤销已经发生的调用。 |
|
|
562
|
+
|
|
563
|
+
结果文件按以下规则读取:
|
|
564
|
+
|
|
565
|
+
- 空文件或未写入结果等同于 `{"action": "allow"}`。
|
|
566
|
+
- JSON 无效、顶层不是对象或文件超过 1 MiB 时,iCode 会记录警告并忽略结果,按无决定处理。
|
|
567
|
+
- 未知字段会被忽略。
|
|
568
|
+
|
|
569
|
+
多个钩子的决定如何组合,见[多个钩子的执行顺序与配置合并](#多个钩子的执行顺序与配置合并)。
|
|
570
|
+
|
|
571
|
+
## 多个钩子的执行顺序与配置合并
|
|
572
|
+
|
|
573
|
+
### 执行顺序
|
|
574
|
+
|
|
575
|
+
同时加载项目配置和全局配置时,执行模式决定钩子在哪个阶段运行,配置来源决定每个阶段内的顺序。对于同一次事件,iCode 按以下两个阶段处理钩子:
|
|
576
|
+
|
|
577
|
+
1. 依次检查并运行匹配的阻塞式钩子:先检查项目钩子,再检查全局钩子,各自保持配置文件中的定义顺序。
|
|
578
|
+
2. 如果没有钩子拒绝操作,iCode 再启动匹配的异步和即发即弃钩子:先按项目配置中的定义顺序启动,再按全局配置中的定义顺序启动。这些非阻塞钩子可能并发运行,因此完成顺序不一定与启动顺序相同。
|
|
579
|
+
|
|
580
|
+
阻塞式钩子返回的操作决定按以下规则组合:
|
|
581
|
+
|
|
582
|
+
| 操作决定 | 多个阻塞式钩子返回时的组合方式 |
|
|
583
|
+
| --- | --- |
|
|
584
|
+
| `args_override` | 立即修改工具参数。后续钩子使用修改后的参数进行匹配和检查;多个钩子修改同一参数时,后运行的钩子覆盖先运行的钩子。 |
|
|
585
|
+
| `system_reminder`、`extra_context` | 按钩子的执行顺序累积。 |
|
|
586
|
+
| `action: block` | 对 `user_prompt_submit` 和 `before_tool_call`,第一个拒绝决定会停止当前事件的剩余钩子,包括尚未启动的非阻塞钩子。 |
|
|
587
|
+
|
|
588
|
+
对于 `user_prompt_submit` 和 `before_tool_call`,阻塞式钩子失败且配置了 `on_error: block` 时,同样会拒绝当前操作并停止当前事件的剩余钩子。
|
|
589
|
+
|
|
590
|
+
因此,项目钩子修改工具参数后,后续全局钩子会看到修改后的参数;项目钩子拒绝操作后,当前事件的全局钩子不会运行。
|
|
591
|
+
|
|
592
|
+
### 同名 ID 不会覆盖钩子
|
|
593
|
+
|
|
594
|
+
项目配置和全局配置可以定义相同的 `id`。两个钩子都会保留,iCode 同时会记录重名警告。
|
|
595
|
+
|
|
596
|
+
同一配置文件内不能出现重复的 `id`,否则该配置文件加载失败。`id` 只用于标识钩子,不是覆盖键;在项目配置中定义同名钩子,不能覆盖或停用全局钩子。需要停用全局钩子时,应编辑全局配置,将该钩子的 `enabled` 设为 `false`,或者删除该钩子定义。
|
|
597
|
+
|
|
598
|
+
### 设置合并与加载失败
|
|
599
|
+
|
|
600
|
+
项目配置和全局配置中的 `settings` 按字段合并:项目配置中明确设置的值优先,其次使用全局配置中的值;两处都没有设置时使用默认值。
|
|
601
|
+
|
|
602
|
+
任一配置文件无效时,iCode 会显示警告,并停用该文件定义的所有钩子;另一处有效配置文件仍然生效。未找到配置文件不会产生警告。
|