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.
Files changed (1138) hide show
  1. chrys/__init__.py +16 -0
  2. chrys/app/__init__.py +3 -0
  3. chrys/app/acp/__init__.py +3 -0
  4. chrys/app/acp/bridge.py +664 -0
  5. chrys/app/acp/content.py +132 -0
  6. chrys/app/acp/doc/frontend-api.md +425 -0
  7. chrys/app/acp/history.py +585 -0
  8. chrys/app/acp/server.py +1796 -0
  9. chrys/app/acp/session_manager.py +1815 -0
  10. chrys/app/acp/tool_status.py +45 -0
  11. chrys/app/cli/__init__.py +3 -0
  12. chrys/app/cli/acp.py +178 -0
  13. chrys/app/cli/app.py +165 -0
  14. chrys/app/cli/approvals.py +101 -0
  15. chrys/app/cli/headless.py +223 -0
  16. chrys/app/cli/launch_cwd.py +42 -0
  17. chrys/app/cli/profiles.py +298 -0
  18. chrys/app/cli/progress.py +857 -0
  19. chrys/app/cli/run.py +425 -0
  20. chrys/app/cli/serve.py +1593 -0
  21. chrys/app/cli/tool_summary.py +225 -0
  22. chrys/app/cli/trajectory.py +201 -0
  23. chrys/app/cli/workflow.py +601 -0
  24. chrys/app/features/__init__.py +3 -0
  25. chrys/app/features/buddy/__init__.py +3 -0
  26. chrys/app/features/buddy/actions.py +68 -0
  27. chrys/app/features/buddy/animation.py +76 -0
  28. chrys/app/features/buddy/commands.py +196 -0
  29. chrys/app/features/buddy/docs/design.md +187 -0
  30. chrys/app/features/buddy/hatchery.py +80 -0
  31. chrys/app/features/buddy/lifecycle.py +41 -0
  32. chrys/app/features/buddy/model.py +265 -0
  33. chrys/app/features/buddy/pixel_renderer.py +113 -0
  34. chrys/app/features/buddy/pixel_sprites.py +279 -0
  35. chrys/app/features/buddy/portrait.py +76 -0
  36. chrys/app/features/buddy/progression.py +58 -0
  37. chrys/app/features/buddy/replies.py +191 -0
  38. chrys/app/features/buddy/sprites/alien.toml +70 -0
  39. chrys/app/features/buddy/sprites/axolotl.toml +71 -0
  40. chrys/app/features/buddy/sprites/bat.toml +69 -0
  41. chrys/app/features/buddy/sprites/bee.toml +69 -0
  42. chrys/app/features/buddy/sprites/cactus.toml +73 -0
  43. chrys/app/features/buddy/sprites/capybara.toml +70 -0
  44. chrys/app/features/buddy/sprites/cat.toml +69 -0
  45. chrys/app/features/buddy/sprites/crab.toml +70 -0
  46. chrys/app/features/buddy/sprites/dragon.toml +71 -0
  47. chrys/app/features/buddy/sprites/duck.toml +69 -0
  48. chrys/app/features/buddy/sprites/fox.toml +69 -0
  49. chrys/app/features/buddy/sprites/frog.toml +70 -0
  50. chrys/app/features/buddy/sprites/ghost.toml +70 -0
  51. chrys/app/features/buddy/sprites/goose.toml +69 -0
  52. chrys/app/features/buddy/sprites/jelly.toml +70 -0
  53. chrys/app/features/buddy/sprites/llama.toml +70 -0
  54. chrys/app/features/buddy/sprites/mushroom.toml +69 -0
  55. chrys/app/features/buddy/sprites/octopus.toml +70 -0
  56. chrys/app/features/buddy/sprites/owl.toml +70 -0
  57. chrys/app/features/buddy/sprites/panda.toml +71 -0
  58. chrys/app/features/buddy/sprites/penguin.toml +69 -0
  59. chrys/app/features/buddy/sprites/rabbit.toml +70 -0
  60. chrys/app/features/buddy/sprites/robot.toml +72 -0
  61. chrys/app/features/buddy/sprites/shark.toml +70 -0
  62. chrys/app/features/buddy/sprites/snail.toml +69 -0
  63. chrys/app/features/buddy/sprites/snake.toml +69 -0
  64. chrys/app/features/buddy/sprites/tabby.toml +69 -0
  65. chrys/app/features/buddy/sprites/turtle.toml +69 -0
  66. chrys/app/features/buddy/store.py +143 -0
  67. chrys/app/features/session_title/__init__.py +7 -0
  68. chrys/app/features/session_title/updater.py +582 -0
  69. chrys/app/installer.py +651 -0
  70. chrys/app/parsing.py +17 -0
  71. chrys/app/tui/__init__.py +3 -0
  72. chrys/app/tui/app.py +1287 -0
  73. chrys/app/tui/behaviors/__init__.py +3 -0
  74. chrys/app/tui/behaviors/click_outside_dismiss.py +90 -0
  75. chrys/app/tui/behaviors/insert_clipboard.py +73 -0
  76. chrys/app/tui/behaviors/right_click_copy.py +146 -0
  77. chrys/app/tui/binding_display.py +139 -0
  78. chrys/app/tui/buddy_messages.py +17 -0
  79. chrys/app/tui/buddy_reply.py +86 -0
  80. chrys/app/tui/chrys.tcss +549 -0
  81. chrys/app/tui/clipboard.py +109 -0
  82. chrys/app/tui/copy_messages.py +10 -0
  83. chrys/app/tui/i18n.py +230 -0
  84. chrys/app/tui/language.py +58 -0
  85. chrys/app/tui/notifications/__init__.py +12 -0
  86. chrys/app/tui/notifications/drivers.py +180 -0
  87. chrys/app/tui/notifications/service.py +126 -0
  88. chrys/app/tui/notifications/settings.py +141 -0
  89. chrys/app/tui/screens/__init__.py +3 -0
  90. chrys/app/tui/screens/agents/__init__.py +8 -0
  91. chrys/app/tui/screens/agents/agent_draft_store.py +937 -0
  92. chrys/app/tui/screens/agents/config.py +2142 -0
  93. chrys/app/tui/screens/agents/config.tcss +169 -0
  94. chrys/app/tui/screens/agents/panels/__init__.py +3 -0
  95. chrys/app/tui/screens/agents/panels/acp.py +1176 -0
  96. chrys/app/tui/screens/agents/panels/basic.py +497 -0
  97. chrys/app/tui/screens/agents/panels/compaction.py +231 -0
  98. chrys/app/tui/screens/agents/panels/config_card.py +218 -0
  99. chrys/app/tui/screens/agents/panels/instructions.py +91 -0
  100. chrys/app/tui/screens/agents/panels/markdown_report.py +76 -0
  101. chrys/app/tui/screens/agents/panels/mcp.py +2262 -0
  102. chrys/app/tui/screens/agents/panels/memory.py +684 -0
  103. chrys/app/tui/screens/agents/panels/path_entry.py +227 -0
  104. chrys/app/tui/screens/agents/panels/skills.py +806 -0
  105. chrys/app/tui/screens/agents/panels/subagents.py +652 -0
  106. chrys/app/tui/screens/agents/panels/tools.py +205 -0
  107. chrys/app/tui/screens/agents/picker.py +103 -0
  108. chrys/app/tui/screens/agents/skill_paths.py +38 -0
  109. chrys/app/tui/screens/agents/validation_messages.py +452 -0
  110. chrys/app/tui/screens/dialogs/__init__.py +35 -0
  111. chrys/app/tui/screens/dialogs/agent_load.py +834 -0
  112. chrys/app/tui/screens/dialogs/agent_load.tcss +78 -0
  113. chrys/app/tui/screens/dialogs/app_mode.py +55 -0
  114. chrys/app/tui/screens/dialogs/approval/__init__.py +15 -0
  115. chrys/app/tui/screens/dialogs/approval/approval.tcss +311 -0
  116. chrys/app/tui/screens/dialogs/approval/bodies/__init__.py +3 -0
  117. chrys/app/tui/screens/dialogs/approval/bodies/file_edit.py +210 -0
  118. chrys/app/tui/screens/dialogs/approval/bodies/sub_agent.py +82 -0
  119. chrys/app/tui/screens/dialogs/approval/body.py +110 -0
  120. chrys/app/tui/screens/dialogs/approval/dialog.py +565 -0
  121. chrys/app/tui/screens/dialogs/approval/mode.py +105 -0
  122. chrys/app/tui/screens/dialogs/ask_user.py +148 -0
  123. chrys/app/tui/screens/dialogs/ask_user.tcss +62 -0
  124. chrys/app/tui/screens/dialogs/base.py +84 -0
  125. chrys/app/tui/screens/dialogs/confirm.py +184 -0
  126. chrys/app/tui/screens/dialogs/confirm.tcss +46 -0
  127. chrys/app/tui/screens/dialogs/connection_test.py +183 -0
  128. chrys/app/tui/screens/dialogs/connection_test.tcss +92 -0
  129. chrys/app/tui/screens/dialogs/diagram.py +102 -0
  130. chrys/app/tui/screens/dialogs/diagram.tcss +24 -0
  131. chrys/app/tui/screens/dialogs/editor.py +378 -0
  132. chrys/app/tui/screens/dialogs/editor.tcss +132 -0
  133. chrys/app/tui/screens/dialogs/file_picker.py +582 -0
  134. chrys/app/tui/screens/dialogs/file_picker.tcss +78 -0
  135. chrys/app/tui/screens/dialogs/fork_session.py +219 -0
  136. chrys/app/tui/screens/dialogs/fork_session.tcss +75 -0
  137. chrys/app/tui/screens/dialogs/image_compression.py +102 -0
  138. chrys/app/tui/screens/dialogs/image_compression.tcss +28 -0
  139. chrys/app/tui/screens/dialogs/man_page.py +172 -0
  140. chrys/app/tui/screens/dialogs/man_page.tcss +39 -0
  141. chrys/app/tui/screens/dialogs/new_folder.py +277 -0
  142. chrys/app/tui/screens/dialogs/new_folder.tcss +51 -0
  143. chrys/app/tui/screens/dialogs/notice.tcss +14 -0
  144. chrys/app/tui/screens/dialogs/prompt_cache.py +144 -0
  145. chrys/app/tui/screens/dialogs/prompt_cache.tcss +38 -0
  146. chrys/app/tui/screens/dialogs/runtime_details.py +371 -0
  147. chrys/app/tui/screens/dialogs/runtime_details.tcss +49 -0
  148. chrys/app/tui/screens/dialogs/session_title.py +110 -0
  149. chrys/app/tui/screens/dialogs/session_title.tcss +43 -0
  150. chrys/app/tui/screens/dialogs/tool_view.py +207 -0
  151. chrys/app/tui/screens/dialogs/tool_view.tcss +43 -0
  152. chrys/app/tui/screens/dialogs/vision_unsupported.py +122 -0
  153. chrys/app/tui/screens/dialogs/vision_unsupported.tcss +35 -0
  154. chrys/app/tui/screens/dialogs/workflow_confirm.py +91 -0
  155. chrys/app/tui/screens/dialogs/workflow_confirm.tcss +17 -0
  156. chrys/app/tui/screens/dialogs/workflow_input.py +258 -0
  157. chrys/app/tui/screens/dialogs/workflow_input.tcss +73 -0
  158. chrys/app/tui/screens/dialogs/workflow_node.py +462 -0
  159. chrys/app/tui/screens/dialogs/workflow_node.tcss +41 -0
  160. chrys/app/tui/screens/dialogs/workflow_picker.py +46 -0
  161. chrys/app/tui/screens/dialogs/workflow_result.py +136 -0
  162. chrys/app/tui/screens/dialogs/workflow_result.tcss +14 -0
  163. chrys/app/tui/screens/diff/__init__.py +22 -0
  164. chrys/app/tui/screens/diff/rollback_modal.py +1381 -0
  165. chrys/app/tui/screens/diff/rollback_modal.tcss +248 -0
  166. chrys/app/tui/screens/diff/screen.py +1532 -0
  167. chrys/app/tui/screens/diff/screen.tcss +104 -0
  168. chrys/app/tui/screens/guides/__init__.py +7 -0
  169. chrys/app/tui/screens/guides/_docs/en/guides/configuration/agents.md +178 -0
  170. chrys/app/tui/screens/guides/_docs/en/guides/configuration/approval.md +117 -0
  171. chrys/app/tui/screens/guides/_docs/en/guides/configuration/chat-options.md +276 -0
  172. chrys/app/tui/screens/guides/_docs/en/guides/configuration/compaction.md +42 -0
  173. chrys/app/tui/screens/guides/_docs/en/guides/configuration/memory.md +48 -0
  174. chrys/app/tui/screens/guides/_docs/en/guides/configuration/models.md +158 -0
  175. chrys/app/tui/screens/guides/_docs/en/guides/configuration/settings.md +210 -0
  176. chrys/app/tui/screens/guides/_docs/en/guides/configuration/themes.md +61 -0
  177. chrys/app/tui/screens/guides/_docs/en/guides/configuration/tools.md +60 -0
  178. chrys/app/tui/screens/guides/_docs/en/guides/configuration/web-tools.md +286 -0
  179. chrys/app/tui/screens/guides/_docs/en/guides/daily-use/sessions.md +77 -0
  180. chrys/app/tui/screens/guides/_docs/en/guides/daily-use/workspaces.md +51 -0
  181. chrys/app/tui/screens/guides/_docs/en/guides/extensions/external-acp-agents.md +126 -0
  182. chrys/app/tui/screens/guides/_docs/en/guides/extensions/hooks.md +167 -0
  183. chrys/app/tui/screens/guides/_docs/en/guides/extensions/mcp.md +95 -0
  184. chrys/app/tui/screens/guides/_docs/en/guides/extensions/skills.md +175 -0
  185. chrys/app/tui/screens/guides/_docs/en/guides/running/icode-acp.md +61 -0
  186. chrys/app/tui/screens/guides/_docs/en/guides/running/icode-run.md +190 -0
  187. chrys/app/tui/screens/guides/_docs/en/guides/running/icode-serve.md +239 -0
  188. chrys/app/tui/screens/guides/_docs/en/guides/running/workflows.md +664 -0
  189. chrys/app/tui/screens/guides/_docs/en/reference/agent-profile.md +548 -0
  190. chrys/app/tui/screens/guides/_docs/en/reference/hooks.md +602 -0
  191. chrys/app/tui/screens/guides/_docs/en/reference/opentelemetry.md +177 -0
  192. chrys/app/tui/screens/guides/_docs/en/reference/settings.md +245 -0
  193. chrys/app/tui/screens/guides/_docs/en/reference/themes.md +149 -0
  194. chrys/app/tui/screens/guides/_docs/en/reference/tool-kinds-and-names.md +58 -0
  195. chrys/app/tui/screens/guides/_docs/en/reference/tui-slash-commands.md +76 -0
  196. chrys/app/tui/screens/guides/_docs/en/reference/workflows.md +1006 -0
  197. chrys/app/tui/screens/guides/_docs/en/start/getting-started.md +170 -0
  198. chrys/app/tui/screens/guides/_docs/en/start/what-is-icode.md +34 -0
  199. chrys/app/tui/screens/guides/_docs/index.yaml +100 -0
  200. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/agents.md +178 -0
  201. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/approval.md +117 -0
  202. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/chat-options.md +276 -0
  203. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/compaction.md +42 -0
  204. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/memory.md +48 -0
  205. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/models.md +158 -0
  206. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/settings.md +210 -0
  207. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/themes.md +61 -0
  208. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/tools.md +60 -0
  209. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/configuration/web-tools.md +286 -0
  210. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/daily-use/sessions.md +77 -0
  211. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/daily-use/workspaces.md +51 -0
  212. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/extensions/external-acp-agents.md +126 -0
  213. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/extensions/hooks.md +167 -0
  214. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/extensions/mcp.md +95 -0
  215. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/extensions/skills.md +175 -0
  216. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/running/icode-acp.md +61 -0
  217. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/running/icode-run.md +190 -0
  218. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/running/icode-serve.md +239 -0
  219. chrys/app/tui/screens/guides/_docs/zh-Hans/guides/running/workflows.md +664 -0
  220. chrys/app/tui/screens/guides/_docs/zh-Hans/reference/agent-profile.md +548 -0
  221. chrys/app/tui/screens/guides/_docs/zh-Hans/reference/hooks.md +602 -0
  222. chrys/app/tui/screens/guides/_docs/zh-Hans/reference/opentelemetry.md +177 -0
  223. chrys/app/tui/screens/guides/_docs/zh-Hans/reference/settings.md +245 -0
  224. chrys/app/tui/screens/guides/_docs/zh-Hans/reference/themes.md +149 -0
  225. chrys/app/tui/screens/guides/_docs/zh-Hans/reference/tool-kinds-and-names.md +58 -0
  226. chrys/app/tui/screens/guides/_docs/zh-Hans/reference/tui-slash-commands.md +76 -0
  227. chrys/app/tui/screens/guides/_docs/zh-Hans/reference/workflows.md +1005 -0
  228. chrys/app/tui/screens/guides/_docs/zh-Hans/start/getting-started.md +170 -0
  229. chrys/app/tui/screens/guides/_docs/zh-Hans/start/what-is-icode.md +34 -0
  230. chrys/app/tui/screens/guides/index.py +215 -0
  231. chrys/app/tui/screens/guides/reader.py +173 -0
  232. chrys/app/tui/screens/guides/screen.py +442 -0
  233. chrys/app/tui/screens/guides/screen.tcss +52 -0
  234. chrys/app/tui/screens/logs/__init__.py +7 -0
  235. chrys/app/tui/screens/logs/screen.py +504 -0
  236. chrys/app/tui/screens/logs/screen.tcss +45 -0
  237. chrys/app/tui/screens/main/__init__.py +7 -0
  238. chrys/app/tui/screens/main/action_availability.py +30 -0
  239. chrys/app/tui/screens/main/buddy_command.py +143 -0
  240. chrys/app/tui/screens/main/commands.py +1073 -0
  241. chrys/app/tui/screens/main/config_actions.py +464 -0
  242. chrys/app/tui/screens/main/copy_actions.py +117 -0
  243. chrys/app/tui/screens/main/dialog_controllers.py +826 -0
  244. chrys/app/tui/screens/main/dialog_gateway.py +166 -0
  245. chrys/app/tui/screens/main/diff_controller.py +478 -0
  246. chrys/app/tui/screens/main/engine_read_model.py +184 -0
  247. chrys/app/tui/screens/main/event_handlers.py +2014 -0
  248. chrys/app/tui/screens/main/input_flow.py +241 -0
  249. chrys/app/tui/screens/main/live_diff.py +244 -0
  250. chrys/app/tui/screens/main/main_screen_presenter.py +295 -0
  251. chrys/app/tui/screens/main/model_indicator.py +217 -0
  252. chrys/app/tui/screens/main/navigation.py +343 -0
  253. chrys/app/tui/screens/main/ports.py +571 -0
  254. chrys/app/tui/screens/main/recent_dirs.py +123 -0
  255. chrys/app/tui/screens/main/rollback_controller.py +586 -0
  256. chrys/app/tui/screens/main/runtime_info.py +71 -0
  257. chrys/app/tui/screens/main/screen.py +2265 -0
  258. chrys/app/tui/screens/main/screen.tcss +21 -0
  259. chrys/app/tui/screens/main/session_handlers.py +1127 -0
  260. chrys/app/tui/screens/main/session_title.py +239 -0
  261. chrys/app/tui/screens/main/settings_coordinator.py +365 -0
  262. chrys/app/tui/screens/main/settings_persistence.py +184 -0
  263. chrys/app/tui/screens/main/shell_mode.py +112 -0
  264. chrys/app/tui/screens/main/state.py +289 -0
  265. chrys/app/tui/screens/main/submit_state.py +11 -0
  266. chrys/app/tui/screens/main/subscriptions.py +177 -0
  267. chrys/app/tui/screens/main/suggestions.py +982 -0
  268. chrys/app/tui/screens/main/tool_action_bridge.py +75 -0
  269. chrys/app/tui/screens/main/view_adapter.py +1567 -0
  270. chrys/app/tui/screens/main/workflow_browser.py +747 -0
  271. chrys/app/tui/screens/main/workflow_content.py +248 -0
  272. chrys/app/tui/screens/main/workflow_controller.py +240 -0
  273. chrys/app/tui/screens/main/workflow_feedback.py +137 -0
  274. chrys/app/tui/screens/main/workflow_flow.py +49 -0
  275. chrys/app/tui/screens/main/workflow_run_control.py +456 -0
  276. chrys/app/tui/screens/main/workflow_session_view.py +316 -0
  277. chrys/app/tui/screens/main/workspace_actions.py +272 -0
  278. chrys/app/tui/screens/main/workspace_branch.py +194 -0
  279. chrys/app/tui/screens/menus/__init__.py +8 -0
  280. chrys/app/tui/screens/menus/languages.py +114 -0
  281. chrys/app/tui/screens/models/__init__.py +7 -0
  282. chrys/app/tui/screens/models/picker.py +147 -0
  283. chrys/app/tui/screens/models/screen.py +2043 -0
  284. chrys/app/tui/screens/models/screen.tcss +255 -0
  285. chrys/app/tui/screens/sessions/__init__.py +8 -0
  286. chrys/app/tui/screens/sessions/presenter.py +586 -0
  287. chrys/app/tui/screens/sessions/screen.py +779 -0
  288. chrys/app/tui/screens/sessions/screen.tcss +127 -0
  289. chrys/app/tui/screens/settings/__init__.py +29 -0
  290. chrys/app/tui/screens/settings/danger.py +26 -0
  291. chrys/app/tui/screens/settings/dialog.py +281 -0
  292. chrys/app/tui/screens/settings/layout.py +519 -0
  293. chrys/app/tui/screens/settings/migrate_dialog.py +253 -0
  294. chrys/app/tui/screens/settings/panes/__init__.py +3 -0
  295. chrys/app/tui/screens/settings/panes/notifications.py +248 -0
  296. chrys/app/tui/screens/settings/panes/sessions.py +148 -0
  297. chrys/app/tui/screens/settings/ports.py +55 -0
  298. chrys/app/tui/screens/settings/provenance.py +102 -0
  299. chrys/app/tui/screens/settings/rows.py +546 -0
  300. chrys/app/tui/screens/settings/settings.tcss +406 -0
  301. chrys/app/tui/screens/themes/__init__.py +8 -0
  302. chrys/app/tui/screens/themes/dialogs.py +330 -0
  303. chrys/app/tui/screens/themes/editor.py +632 -0
  304. chrys/app/tui/screens/themes/editor.tcss +268 -0
  305. chrys/app/tui/screens/themes/messages.py +95 -0
  306. chrys/app/tui/screens/themes/palette.py +694 -0
  307. chrys/app/tui/screens/themes/panel.py +113 -0
  308. chrys/app/tui/screens/themes/picker.py +203 -0
  309. chrys/app/tui/screens/themes/save.py +191 -0
  310. chrys/app/tui/support/__init__.py +3 -0
  311. chrys/app/tui/support/file_manager.py +64 -0
  312. chrys/app/tui/support/gc_freeze.py +1114 -0
  313. chrys/app/tui/support/path_shortcuts.py +50 -0
  314. chrys/app/tui/support/prompt_history.py +298 -0
  315. chrys/app/tui/support/workspace_mru.py +476 -0
  316. chrys/app/tui/terminal/__init__.py +6 -0
  317. chrys/app/tui/terminal/_pty_backend.py +114 -0
  318. chrys/app/tui/terminal/emulator/__init__.py +24 -0
  319. chrys/app/tui/terminal/emulator/buffer.py +456 -0
  320. chrys/app/tui/terminal/emulator/charsets.py +113 -0
  321. chrys/app/tui/terminal/emulator/core.py +963 -0
  322. chrys/app/tui/terminal/emulator/input.py +342 -0
  323. chrys/app/tui/terminal/emulator/parser.py +227 -0
  324. chrys/app/tui/terminal/emulator/pen.py +158 -0
  325. chrys/app/tui/terminal/launcher.py +455 -0
  326. chrys/app/tui/terminal/leaked_reports.py +44 -0
  327. chrys/app/tui/terminal/panel.py +323 -0
  328. chrys/app/tui/terminal/pty_process.py +405 -0
  329. chrys/app/tui/terminal/rendering.py +151 -0
  330. chrys/app/tui/terminal/shell.py +273 -0
  331. chrys/app/tui/terminal/shell_integration.py +199 -0
  332. chrys/app/tui/terminal/title.py +224 -0
  333. chrys/app/tui/terminal/widget.py +654 -0
  334. chrys/app/tui/theme.py +422 -0
  335. chrys/app/tui/theme_loader.py +201 -0
  336. chrys/app/tui/theme_stylesheet.py +49 -0
  337. chrys/app/tui/themes/__init__.py +3 -0
  338. chrys/app/tui/themes/document.py +120 -0
  339. chrys/app/tui/themes/preview.py +170 -0
  340. chrys/app/tui/themes/store.py +176 -0
  341. chrys/app/tui/toasts.py +69 -0
  342. chrys/app/tui/util/__init__.py +3 -0
  343. chrys/app/tui/util/context_pressure.py +146 -0
  344. chrys/app/tui/util/debug_log.py +292 -0
  345. chrys/app/tui/util/diff_entries.py +64 -0
  346. chrys/app/tui/util/formatting.py +53 -0
  347. chrys/app/tui/util/git_branch.py +326 -0
  348. chrys/app/tui/util/invocation_progress.py +57 -0
  349. chrys/app/tui/util/logo.py +32 -0
  350. chrys/app/tui/util/message_gate.py +35 -0
  351. chrys/app/tui/util/mutation_sources.py +14 -0
  352. chrys/app/tui/util/picker_text.py +27 -0
  353. chrys/app/tui/util/removal.py +47 -0
  354. chrys/app/tui/util/rich_style.py +36 -0
  355. chrys/app/tui/util/source_text.py +12 -0
  356. chrys/app/tui/util/static_update.py +88 -0
  357. chrys/app/tui/util/todo_format.py +51 -0
  358. chrys/app/tui/util/visibility.py +214 -0
  359. chrys/app/tui/widgets/__init__.py +60 -0
  360. chrys/app/tui/widgets/ask_user_controls.py +652 -0
  361. chrys/app/tui/widgets/ask_user_markdown.py +17 -0
  362. chrys/app/tui/widgets/ask_user_prompt.py +606 -0
  363. chrys/app/tui/widgets/buttons.py +52 -0
  364. chrys/app/tui/widgets/chat/__init__.py +3 -0
  365. chrys/app/tui/widgets/chat/agent_transcript_surface.py +818 -0
  366. chrys/app/tui/widgets/chat/chrome.py +296 -0
  367. chrys/app/tui/widgets/chat/compaction_card.py +353 -0
  368. chrys/app/tui/widgets/chat/context_fold.py +77 -0
  369. chrys/app/tui/widgets/chat/file_snapshot.py +91 -0
  370. chrys/app/tui/widgets/chat/image_preview.py +214 -0
  371. chrys/app/tui/widgets/chat/live_renderer.py +383 -0
  372. chrys/app/tui/widgets/chat/messages.py +1039 -0
  373. chrys/app/tui/widgets/chat/panel.py +1769 -0
  374. chrys/app/tui/widgets/chat/ports.py +245 -0
  375. chrys/app/tui/widgets/chat/renderers/__init__.py +7 -0
  376. chrys/app/tui/widgets/chat/renderers/ask_user.py +747 -0
  377. chrys/app/tui/widgets/chat/renderers/execute.py +431 -0
  378. chrys/app/tui/widgets/chat/renderers/file_edit.py +925 -0
  379. chrys/app/tui/widgets/chat/renderers/hosted_code.py +83 -0
  380. chrys/app/tui/widgets/chat/renderers/hosted_generic.py +330 -0
  381. chrys/app/tui/widgets/chat/renderers/hosted_image.py +107 -0
  382. chrys/app/tui/widgets/chat/renderers/hosted_mcp.py +43 -0
  383. chrys/app/tui/widgets/chat/renderers/hosted_search.py +167 -0
  384. chrys/app/tui/widgets/chat/renderers/hosted_shell.py +132 -0
  385. chrys/app/tui/widgets/chat/renderers/read_file.py +399 -0
  386. chrys/app/tui/widgets/chat/renderers/search.py +348 -0
  387. chrys/app/tui/widgets/chat/renderers/skill.py +564 -0
  388. chrys/app/tui/widgets/chat/renderers/sleep.py +287 -0
  389. chrys/app/tui/widgets/chat/renderers/sub_agent.py +1385 -0
  390. chrys/app/tui/widgets/chat/renderers/todo.py +114 -0
  391. chrys/app/tui/widgets/chat/renderers/web.py +69 -0
  392. chrys/app/tui/widgets/chat/replay.py +1605 -0
  393. chrys/app/tui/widgets/chat/replay_mount.py +322 -0
  394. chrys/app/tui/widgets/chat/scroll_controller.py +579 -0
  395. chrys/app/tui/widgets/chat/selection_controller.py +435 -0
  396. chrys/app/tui/widgets/chat/session_json.py +508 -0
  397. chrys/app/tui/widgets/chat/toc_model.py +156 -0
  398. chrys/app/tui/widgets/chat/tool_call.py +2478 -0
  399. chrys/app/tui/widgets/chat/tool_registry.py +753 -0
  400. chrys/app/tui/widgets/chat/tool_renderers.py +247 -0
  401. chrys/app/tui/widgets/chat/tool_view_builders.py +260 -0
  402. chrys/app/tui/widgets/chat/transcript_reader.py +57 -0
  403. chrys/app/tui/widgets/checkbox.py +24 -0
  404. chrys/app/tui/widgets/chrome/__init__.py +3 -0
  405. chrys/app/tui/widgets/chrome/app_header.py +283 -0
  406. chrys/app/tui/widgets/chrome/commands.py +95 -0
  407. chrys/app/tui/widgets/chrome/file_index.py +68 -0
  408. chrys/app/tui/widgets/chrome/file_scanner.py +670 -0
  409. chrys/app/tui/widgets/chrome/footer.py +284 -0
  410. chrys/app/tui/widgets/chrome/image_paste.py +351 -0
  411. chrys/app/tui/widgets/chrome/input_bar.py +1299 -0
  412. chrys/app/tui/widgets/chrome/status_bar.py +911 -0
  413. chrys/app/tui/widgets/chrome/suggestion_list.py +652 -0
  414. chrys/app/tui/widgets/click_affordance.py +24 -0
  415. chrys/app/tui/widgets/color_picker/__init__.py +254 -0
  416. chrys/app/tui/widgets/color_picker/controls.py +171 -0
  417. chrys/app/tui/widgets/color_picker/model.py +89 -0
  418. chrys/app/tui/widgets/dialog_buttons.py +58 -0
  419. chrys/app/tui/widgets/dialog_scroll.py +24 -0
  420. chrys/app/tui/widgets/diff_view/__init__.py +20 -0
  421. chrys/app/tui/widgets/diff_view/cells.py +59 -0
  422. chrys/app/tui/widgets/diff_view/code.py +280 -0
  423. chrys/app/tui/widgets/diff_view/compute.py +286 -0
  424. chrys/app/tui/widgets/diff_view/gutter.py +161 -0
  425. chrys/app/tui/widgets/diff_view/inline.py +77 -0
  426. chrys/app/tui/widgets/diff_view/palette.py +87 -0
  427. chrys/app/tui/widgets/diff_view/protocols.py +24 -0
  428. chrys/app/tui/widgets/diff_view/rows.py +138 -0
  429. chrys/app/tui/widgets/diff_view/unified.py +267 -0
  430. chrys/app/tui/widgets/diff_view/widget.py +209 -0
  431. chrys/app/tui/widgets/editor/__init__.py +79 -0
  432. chrys/app/tui/widgets/editor/coordinates.py +30 -0
  433. chrys/app/tui/widgets/editor/highlighter.py +139 -0
  434. chrys/app/tui/widgets/editor/keymaps.py +357 -0
  435. chrys/app/tui/widgets/editor/types.py +216 -0
  436. chrys/app/tui/widgets/editor/vim.py +1195 -0
  437. chrys/app/tui/widgets/editor/widget.py +401 -0
  438. chrys/app/tui/widgets/file_preview.py +58 -0
  439. chrys/app/tui/widgets/hatch.py +138 -0
  440. chrys/app/tui/widgets/input.py +66 -0
  441. chrys/app/tui/widgets/loading.py +125 -0
  442. chrys/app/tui/widgets/markdown/__init__.py +25 -0
  443. chrys/app/tui/widgets/markdown/_utils.py +21 -0
  444. chrys/app/tui/widgets/markdown/anchors.py +71 -0
  445. chrys/app/tui/widgets/markdown/blocks.py +115 -0
  446. chrys/app/tui/widgets/markdown/copyable.py +163 -0
  447. chrys/app/tui/widgets/markdown/diagram/__init__.py +35 -0
  448. chrys/app/tui/widgets/markdown/diagram/canvas.py +409 -0
  449. chrys/app/tui/widgets/markdown/diagram/charts.py +52 -0
  450. chrys/app/tui/widgets/markdown/diagram/diagnostics.py +101 -0
  451. chrys/app/tui/widgets/markdown/diagram/geometry.py +46 -0
  452. chrys/app/tui/widgets/markdown/diagram/layout.py +494 -0
  453. chrys/app/tui/widgets/markdown/diagram/messages.py +18 -0
  454. chrys/app/tui/widgets/markdown/diagram/model.py +275 -0
  455. chrys/app/tui/widgets/markdown/diagram/parser.py +173 -0
  456. chrys/app/tui/widgets/markdown/diagram/parsers/__init__.py +3 -0
  457. chrys/app/tui/widgets/markdown/diagram/parsers/charts.py +349 -0
  458. chrys/app/tui/widgets/markdown/diagram/parsers/common.py +403 -0
  459. chrys/app/tui/widgets/markdown/diagram/parsers/graphs.py +1072 -0
  460. chrys/app/tui/widgets/markdown/diagram/parsers/planning.py +317 -0
  461. chrys/app/tui/widgets/markdown/diagram/parsers/schedule.py +298 -0
  462. chrys/app/tui/widgets/markdown/diagram/parsers/schemas.py +241 -0
  463. chrys/app/tui/widgets/markdown/diagram/parsers/structure.py +221 -0
  464. chrys/app/tui/widgets/markdown/diagram/presentation.py +32 -0
  465. chrys/app/tui/widgets/markdown/diagram/renderers/__init__.py +3 -0
  466. chrys/app/tui/widgets/markdown/diagram/renderers/charts.py +275 -0
  467. chrys/app/tui/widgets/markdown/diagram/renderers/common.py +73 -0
  468. chrys/app/tui/widgets/markdown/diagram/renderers/planning.py +157 -0
  469. chrys/app/tui/widgets/markdown/diagram/renderers/schedule.py +202 -0
  470. chrys/app/tui/widgets/markdown/diagram/renderers/structure.py +77 -0
  471. chrys/app/tui/widgets/markdown/diagram/renderers/xy.py +385 -0
  472. chrys/app/tui/widgets/markdown/diagram/router.py +651 -0
  473. chrys/app/tui/widgets/markdown/diagram/specs/__init__.py +3 -0
  474. chrys/app/tui/widgets/markdown/diagram/specs/charts.py +94 -0
  475. chrys/app/tui/widgets/markdown/diagram/specs/planning.py +68 -0
  476. chrys/app/tui/widgets/markdown/diagram/specs/schedule.py +65 -0
  477. chrys/app/tui/widgets/markdown/diagram/specs/structure.py +23 -0
  478. chrys/app/tui/widgets/markdown/diagram/viewer.py +92 -0
  479. chrys/app/tui/widgets/markdown/links.py +47 -0
  480. chrys/app/tui/widgets/markdown/math/__init__.py +36 -0
  481. chrys/app/tui/widgets/markdown/math/layout.py +739 -0
  482. chrys/app/tui/widgets/markdown/math/markdown.py +291 -0
  483. chrys/app/tui/widgets/markdown/math/parser.py +325 -0
  484. chrys/app/tui/widgets/markdown/math/symbols.py +325 -0
  485. chrys/app/tui/widgets/markdown/navigator.py +80 -0
  486. chrys/app/tui/widgets/markdown/parser.py +1057 -0
  487. chrys/app/tui/widgets/markdown/stream.py +73 -0
  488. chrys/app/tui/widgets/markdown/toc.py +98 -0
  489. chrys/app/tui/widgets/markdown/viewer.py +146 -0
  490. chrys/app/tui/widgets/markdown/widget.py +2046 -0
  491. chrys/app/tui/widgets/marquee.py +101 -0
  492. chrys/app/tui/widgets/option_menu.py +82 -0
  493. chrys/app/tui/widgets/page_navigator.py +118 -0
  494. chrys/app/tui/widgets/select.py +196 -0
  495. chrys/app/tui/widgets/selection.py +59 -0
  496. chrys/app/tui/widgets/sidebar/__init__.py +3 -0
  497. chrys/app/tui/widgets/sidebar/buddy.py +367 -0
  498. chrys/app/tui/widgets/sidebar/context.py +482 -0
  499. chrys/app/tui/widgets/sidebar/debug.py +195 -0
  500. chrys/app/tui/widgets/sidebar/empty_state.py +11 -0
  501. chrys/app/tui/widgets/sidebar/panel.py +198 -0
  502. chrys/app/tui/widgets/sidebar/tasks.py +198 -0
  503. chrys/app/tui/widgets/sidebar/toc.py +166 -0
  504. chrys/app/tui/widgets/sidebar/toc_types.py +30 -0
  505. chrys/app/tui/widgets/syntax_theme.py +85 -0
  506. chrys/app/tui/widgets/text_area.py +258 -0
  507. chrys/app/tui/widgets/trajectory/__init__.py +8 -0
  508. chrys/app/tui/widgets/trajectory/chartkit.py +264 -0
  509. chrys/app/tui/widgets/trajectory/insights.py +1266 -0
  510. chrys/app/tui/widgets/trajectory/overview.py +1101 -0
  511. chrys/app/tui/widgets/trajectory/panel.py +983 -0
  512. chrys/app/tui/widgets/trajectory/presentation.py +311 -0
  513. chrys/app/tui/widgets/trajectory/session_info.py +124 -0
  514. chrys/app/tui/widgets/trajectory/text_view.py +124 -0
  515. chrys/app/tui/widgets/trajectory/timeline.py +380 -0
  516. chrys/app/tui/widgets/welcome.py +126 -0
  517. chrys/app/tui/widgets/workflow/__init__.py +5 -0
  518. chrys/app/tui/widgets/workflow/edges.py +89 -0
  519. chrys/app/tui/widgets/workflow/graph.py +869 -0
  520. chrys/app/tui/widgets/workflow/info.py +310 -0
  521. chrys/app/tui/widgets/workflow/node_view.py +27 -0
  522. chrys/app/tui/widgets/workflow/output.py +225 -0
  523. chrys/app/tui/widgets/workflow/panel.py +658 -0
  524. chrys/app/tui/widgets/workflow/projector.py +324 -0
  525. chrys/app/tui/widgets/workflow/records.py +69 -0
  526. chrys/app/tui/widgets/workflow/scrollbar.py +82 -0
  527. chrys/app/tui/widgets/workflow/selection.py +151 -0
  528. chrys/app/tui/widgets/workflow/source.py +65 -0
  529. chrys/app/tui/widgets/workflow/text.py +257 -0
  530. chrys/app/tui/widgets/workflow/values.py +317 -0
  531. chrys/foundation/__init__.py +0 -0
  532. chrys/foundation/branding.py +15 -0
  533. chrys/foundation/config/__init__.py +7 -0
  534. chrys/foundation/config/coercion.py +374 -0
  535. chrys/foundation/config/context.py +34 -0
  536. chrys/foundation/config/env_file.py +141 -0
  537. chrys/foundation/config/env_layers.py +370 -0
  538. chrys/foundation/config/migrations.py +521 -0
  539. chrys/foundation/config/notification_events.py +22 -0
  540. chrys/foundation/config/process_settings.py +332 -0
  541. chrys/foundation/config/runtime_pointer.py +133 -0
  542. chrys/foundation/config/settings.py +1952 -0
  543. chrys/foundation/config/settings_store.py +996 -0
  544. chrys/foundation/config/spec.py +396 -0
  545. chrys/foundation/config/user_settings.py +140 -0
  546. chrys/foundation/config/warnings.py +262 -0
  547. chrys/foundation/config/web_values.py +135 -0
  548. chrys/foundation/config/yaml_store.py +487 -0
  549. chrys/foundation/errors/__init__.py +68 -0
  550. chrys/foundation/errors/_legacy.py +117 -0
  551. chrys/foundation/errors/_text.py +13 -0
  552. chrys/foundation/errors/_walk.py +85 -0
  553. chrys/foundation/errors/classify.py +278 -0
  554. chrys/foundation/errors/display.py +274 -0
  555. chrys/foundation/errors/formatting.py +283 -0
  556. chrys/foundation/errors/kinds.py +67 -0
  557. chrys/foundation/errors/network.py +497 -0
  558. chrys/foundation/errors/provider.py +445 -0
  559. chrys/foundation/errors/route.py +85 -0
  560. chrys/foundation/events/__init__.py +8 -0
  561. chrys/foundation/events/bus.py +143 -0
  562. chrys/foundation/events/types.py +1629 -0
  563. chrys/foundation/events/workflow.py +38 -0
  564. chrys/foundation/hosted_tools.py +142 -0
  565. chrys/foundation/i18n/__init__.py +32 -0
  566. chrys/foundation/i18n/_catalogs/zh-Hans/LC_MESSAGES/chrys.mo +0 -0
  567. chrys/foundation/i18n/catalogs.py +42 -0
  568. chrys/foundation/i18n/formatting.py +202 -0
  569. chrys/foundation/i18n/locale.py +92 -0
  570. chrys/foundation/i18n/localizer.py +187 -0
  571. chrys/foundation/i18n/messages.py +268 -0
  572. chrys/foundation/io/__init__.py +3 -0
  573. chrys/foundation/io/result_content.py +237 -0
  574. chrys/foundation/models/__init__.py +3 -0
  575. chrys/foundation/models/approval_reuse.py +23 -0
  576. chrys/foundation/models/ask_user.py +468 -0
  577. chrys/foundation/models/execution.py +18 -0
  578. chrys/foundation/models/history_markers.py +115 -0
  579. chrys/foundation/models/invocations.py +63 -0
  580. chrys/foundation/models/mutation_scope.py +28 -0
  581. chrys/foundation/models/session_env.py +87 -0
  582. chrys/foundation/models/session_surface.py +29 -0
  583. chrys/foundation/models/todos.py +74 -0
  584. chrys/foundation/models/turns.py +125 -0
  585. chrys/foundation/models/workflow_session.py +89 -0
  586. chrys/foundation/models/workspace.py +59 -0
  587. chrys/foundation/net/__init__.py +3 -0
  588. chrys/foundation/net/address_class.py +57 -0
  589. chrys/foundation/net/route_probe.py +94 -0
  590. chrys/foundation/net/url.py +107 -0
  591. chrys/foundation/observability/__init__.py +3 -0
  592. chrys/foundation/observability/exporters.py +174 -0
  593. chrys/foundation/observability/gate.py +31 -0
  594. chrys/foundation/observability/setup.py +497 -0
  595. chrys/foundation/observability/sink.py +228 -0
  596. chrys/foundation/patches/__init__.py +19 -0
  597. chrys/foundation/patches/mdurl_cache.py +59 -0
  598. chrys/foundation/patches/patcher.py +287 -0
  599. chrys/foundation/patches/staged_members.py +205 -0
  600. chrys/foundation/patches/textual_block_border.py +105 -0
  601. chrys/foundation/patches/textual_button_ansi.py +65 -0
  602. chrys/foundation/patches/textual_button_ansi_old.txt +68 -0
  603. chrys/foundation/patches/textual_callback_cache.py +248 -0
  604. chrys/foundation/patches/textual_callback_dispatch.py +109 -0
  605. chrys/foundation/patches/textual_compositor_cjk.py +566 -0
  606. chrys/foundation/patches/textual_dispatch_cache.py +150 -0
  607. chrys/foundation/patches/textual_ime_cursor_anchor.py +92 -0
  608. chrys/foundation/patches/textual_kitty_keyboard.py +268 -0
  609. chrys/foundation/patches/textual_lru_acyclic.py +241 -0
  610. chrys/foundation/patches/textual_message_pump.py +136 -0
  611. chrys/foundation/patches/textual_node_diet.py +875 -0
  612. chrys/foundation/patches/textual_one_shot_timer.py +48 -0
  613. chrys/foundation/patches/textual_option_list.py +90 -0
  614. chrys/foundation/patches/textual_precompose.py +89 -0
  615. chrys/foundation/patches/textual_pruned_tabs.py +69 -0
  616. chrys/foundation/patches/textual_reflow_reuse.py +1753 -0
  617. chrys/foundation/patches/textual_removed_node_caches.py +86 -0
  618. chrys/foundation/patches/textual_removed_screen_callbacks.py +55 -0
  619. chrys/foundation/patches/textual_selection_extract.py +48 -0
  620. chrys/foundation/patches/textual_strip_cycles.py +119 -0
  621. chrys/foundation/patches/textual_tab_selection.py +1611 -0
  622. chrys/foundation/patches/textual_timer_skip.py +70 -0
  623. chrys/foundation/patches/textual_utf8_decoder.py +106 -0
  624. chrys/foundation/patches/textual_win_sleep.py +167 -0
  625. chrys/foundation/patches/watchdog_fsevents.py +70 -0
  626. chrys/foundation/patches/watchdog_windows.py +52 -0
  627. chrys/foundation/platform/__init__.py +556 -0
  628. chrys/foundation/platform/c_api.py +32 -0
  629. chrys/foundation/platform/child_reap.py +107 -0
  630. chrys/foundation/platform/command_line.py +95 -0
  631. chrys/foundation/platform/files.py +1470 -0
  632. chrys/foundation/platform/output_capture.py +113 -0
  633. chrys/foundation/platform/paths.py +193 -0
  634. chrys/foundation/platform/process.py +1468 -0
  635. chrys/foundation/platform/pty_output.py +19 -0
  636. chrys/foundation/platform/runtime_paths.py +281 -0
  637. chrys/foundation/platform/win_console.py +129 -0
  638. chrys/foundation/reasoning_origin.py +67 -0
  639. chrys/foundation/recovery.py +16 -0
  640. chrys/foundation/retry.py +278 -0
  641. chrys/foundation/text/__init__.py +3 -0
  642. chrys/foundation/text/encoding.py +603 -0
  643. chrys/foundation/text/images.py +304 -0
  644. chrys/foundation/text/lines.py +24 -0
  645. chrys/foundation/text/mentions.py +90 -0
  646. chrys/foundation/text/model_json.py +25 -0
  647. chrys/foundation/text/reading_order.py +20 -0
  648. chrys/foundation/text/tokenizer.py +25 -0
  649. chrys/foundation/text/tool_output.py +287 -0
  650. chrys/foundation/text/yaml_io.py +62 -0
  651. chrys/foundation/tool_call_context.py +202 -0
  652. chrys/foundation/tool_execution_stamp.py +184 -0
  653. chrys/foundation/tool_invocation_order.py +48 -0
  654. chrys/foundation/tool_kinds.py +102 -0
  655. chrys/foundation/tool_result_metadata.py +287 -0
  656. chrys/foundation/trajectory/__init__.py +10 -0
  657. chrys/foundation/trajectory/context.py +481 -0
  658. chrys/foundation/trajectory/envelope.py +571 -0
  659. chrys/foundation/trajectory/event_types.py +294 -0
  660. chrys/foundation/trajectory/finalizers.py +46 -0
  661. chrys/foundation/trajectory/fingerprint.py +62 -0
  662. chrys/foundation/trajectory/ids.py +155 -0
  663. chrys/foundation/trajectory/keys.py +99 -0
  664. chrys/foundation/trajectory/lease.py +173 -0
  665. chrys/foundation/trajectory/metadata.py +72 -0
  666. chrys/foundation/trajectory/reader.py +271 -0
  667. chrys/foundation/trajectory/recovery.py +225 -0
  668. chrys/foundation/trajectory/revisions.py +152 -0
  669. chrys/foundation/trajectory/segments.py +225 -0
  670. chrys/foundation/trajectory/tools.py +117 -0
  671. chrys/foundation/trajectory/usage.py +151 -0
  672. chrys/foundation/trajectory/writer.py +972 -0
  673. chrys/foundation/trajectory_timing.py +97 -0
  674. chrys/foundation/util/__init__.py +3 -0
  675. chrys/foundation/util/async_tasks.py +29 -0
  676. chrys/foundation/util/chrys_headers.py +23 -0
  677. chrys/foundation/util/env_templates.py +104 -0
  678. chrys/foundation/util/filenames.py +96 -0
  679. chrys/foundation/util/header_charset.py +138 -0
  680. chrys/foundation/util/httpx_helpers.py +12 -0
  681. chrys/foundation/util/lock.py +236 -0
  682. chrys/foundation/util/once_close.py +46 -0
  683. chrys/foundation/util/session_ids.py +29 -0
  684. chrys/foundation/util/shell_tokens.py +88 -0
  685. chrys/foundation/util/sub_agent_context.py +38 -0
  686. chrys/foundation/util/time.py +35 -0
  687. chrys/foundation/util/unicode_scalars.py +36 -0
  688. chrys/foundation/vendor/__init__.py +43 -0
  689. chrys/foundation/vendor/ripgrep/rg-aarch64-apple-darwin +0 -0
  690. chrys/foundation/vendor/ripgrep/rg-aarch64-pc-windows-msvc.exe +0 -0
  691. chrys/foundation/vendor/ripgrep/rg-aarch64-unknown-linux-gnu +0 -0
  692. chrys/foundation/vendor/ripgrep/rg-x86_64-apple-darwin +0 -0
  693. chrys/foundation/vendor/ripgrep/rg-x86_64-pc-windows-msvc.exe +0 -0
  694. chrys/foundation/vendor/ripgrep/rg-x86_64-unknown-linux-musl +0 -0
  695. chrys/kernel/__init__.py +256 -0
  696. chrys/kernel/_content.py +1866 -0
  697. chrys/kernel/_loop_recorder.py +631 -0
  698. chrys/kernel/_null_overlay.py +1026 -0
  699. chrys/kernel/_result_ceiling.py +216 -0
  700. chrys/kernel/_serialization.py +431 -0
  701. chrys/kernel/_tool_arg_errors.py +1629 -0
  702. chrys/kernel/_tool_execution.py +1172 -0
  703. chrys/kernel/_tool_expansion.py +26 -0
  704. chrys/kernel/_types.py +2598 -0
  705. chrys/kernel/agent.py +994 -0
  706. chrys/kernel/client.py +1084 -0
  707. chrys/kernel/compaction.py +1315 -0
  708. chrys/kernel/exceptions.py +211 -0
  709. chrys/kernel/exchanges.py +683 -0
  710. chrys/kernel/identity.py +95 -0
  711. chrys/kernel/images.py +36 -0
  712. chrys/kernel/instrumentation.py +1618 -0
  713. chrys/kernel/loop.py +2308 -0
  714. chrys/kernel/middleware.py +616 -0
  715. chrys/kernel/sessions.py +604 -0
  716. chrys/kernel/tools.py +1061 -0
  717. chrys/kernel/types.py +126 -0
  718. chrys/orchestration/__init__.py +3 -0
  719. chrys/orchestration/engine/__init__.py +3 -0
  720. chrys/orchestration/engine/assembly.py +236 -0
  721. chrys/orchestration/engine/build/__init__.py +3 -0
  722. chrys/orchestration/engine/build/builder.py +1061 -0
  723. chrys/orchestration/engine/build/construction.py +408 -0
  724. chrys/orchestration/engine/build/loaded.py +139 -0
  725. chrys/orchestration/engine/engine.py +789 -0
  726. chrys/orchestration/engine/execution.py +771 -0
  727. chrys/orchestration/engine/loader.py +865 -0
  728. chrys/orchestration/engine/rollback.py +918 -0
  729. chrys/orchestration/engine/run/__init__.py +3 -0
  730. chrys/orchestration/engine/run/active_injection.py +419 -0
  731. chrys/orchestration/engine/run/attachments.py +519 -0
  732. chrys/orchestration/engine/run/bindings.py +1095 -0
  733. chrys/orchestration/engine/run/coordinator.py +1062 -0
  734. chrys/orchestration/engine/run/finalizer.py +417 -0
  735. chrys/orchestration/engine/run/input_refs.py +60 -0
  736. chrys/orchestration/engine/run/prompt_content.py +457 -0
  737. chrys/orchestration/engine/run/resume.py +299 -0
  738. chrys/orchestration/engine/run/retry.py +948 -0
  739. chrys/orchestration/engine/run/runner.py +625 -0
  740. chrys/orchestration/engine/run/runtime_skills.py +146 -0
  741. chrys/orchestration/engine/run/sub_agent_coordination.py +126 -0
  742. chrys/orchestration/engine/run/turn_hooks.py +258 -0
  743. chrys/orchestration/engine/run/turn_state.py +149 -0
  744. chrys/orchestration/engine/run/working_dir.py +50 -0
  745. chrys/orchestration/engine/session_lifecycle.py +2013 -0
  746. chrys/orchestration/engine/state/__init__.py +3 -0
  747. chrys/orchestration/engine/state/active_session.py +183 -0
  748. chrys/orchestration/engine/state/controls.py +639 -0
  749. chrys/orchestration/engine/state/current_agent.py +26 -0
  750. chrys/orchestration/engine/state/lifecycle_permits.py +395 -0
  751. chrys/orchestration/engine/state/machine.py +193 -0
  752. chrys/orchestration/engine/state/session_writer.py +434 -0
  753. chrys/orchestration/engine/trajectory.py +714 -0
  754. chrys/orchestration/engine/usage.py +118 -0
  755. chrys/orchestration/invoker/__init__.py +3 -0
  756. chrys/orchestration/invoker/acp.py +727 -0
  757. chrys/orchestration/invoker/acp_protocol.py +1115 -0
  758. chrys/orchestration/invoker/acp_spec.py +79 -0
  759. chrys/orchestration/invoker/attempts.py +994 -0
  760. chrys/orchestration/invoker/child_compaction.py +131 -0
  761. chrys/orchestration/invoker/child_history.py +99 -0
  762. chrys/orchestration/invoker/contracts.py +253 -0
  763. chrys/orchestration/invoker/evidence.py +94 -0
  764. chrys/orchestration/invoker/kernel.py +343 -0
  765. chrys/orchestration/invoker/origin.py +79 -0
  766. chrys/orchestration/invoker/resources.py +343 -0
  767. chrys/orchestration/invoker/runtime.py +299 -0
  768. chrys/orchestration/invoker/usage.py +80 -0
  769. chrys/orchestration/session_hooks.py +117 -0
  770. chrys/orchestration/session_host.py +1023 -0
  771. chrys/orchestration/session_resources.py +95 -0
  772. chrys/orchestration/session_usage.py +219 -0
  773. chrys/orchestration/startup.py +255 -0
  774. chrys/orchestration/sub_agents/__init__.py +3 -0
  775. chrys/orchestration/sub_agents/acp_policy.py +269 -0
  776. chrys/orchestration/sub_agents/kernel_policy.py +848 -0
  777. chrys/orchestration/sub_agents/registration.py +44 -0
  778. chrys/orchestration/sub_agents/shell.py +337 -0
  779. chrys/orchestration/sub_agents/tools.py +2228 -0
  780. chrys/orchestration/workflows/__init__.py +3 -0
  781. chrys/orchestration/workflows/agent_archive.py +156 -0
  782. chrys/orchestration/workflows/agent_node.py +894 -0
  783. chrys/orchestration/workflows/agent_node_build.py +687 -0
  784. chrys/orchestration/workflows/catalog.py +332 -0
  785. chrys/orchestration/workflows/coordinator.py +771 -0
  786. chrys/orchestration/workflows/hooks.py +176 -0
  787. chrys/orchestration/workflows/preview.py +322 -0
  788. chrys/orchestration/workflows/rollback.py +151 -0
  789. chrys/orchestration/workflows/runner.py +986 -0
  790. chrys/orchestration/workflows/session.py +390 -0
  791. chrys/orchestration/workflows/settings.py +97 -0
  792. chrys/orchestration/workflows/validation.py +674 -0
  793. chrys/orchestration/workflows/worker_client.py +1002 -0
  794. chrys/service/__init__.py +3 -0
  795. chrys/service/acp_client/__init__.py +65 -0
  796. chrys/service/acp_client/_transport.py +922 -0
  797. chrys/service/acp_client/client.py +1311 -0
  798. chrys/service/acp_client/errors.py +224 -0
  799. chrys/service/acp_client/protocol.py +220 -0
  800. chrys/service/acp_client/spawn.py +239 -0
  801. chrys/service/acp_client/spec.py +100 -0
  802. chrys/service/agent_middleware/__init__.py +60 -0
  803. chrys/service/agent_middleware/_metadata_keys.py +52 -0
  804. chrys/service/agent_middleware/control/__init__.py +3 -0
  805. chrys/service/agent_middleware/control/approval.py +769 -0
  806. chrys/service/agent_middleware/control/approval_hooks.py +62 -0
  807. chrys/service/agent_middleware/control/ask_user.py +207 -0
  808. chrys/service/agent_middleware/control/interrupt.py +50 -0
  809. chrys/service/agent_middleware/control/sleep.py +118 -0
  810. chrys/service/agent_middleware/control/todo.py +117 -0
  811. chrys/service/agent_middleware/events/__init__.py +3 -0
  812. chrys/service/agent_middleware/events/hook_dispatch.py +250 -0
  813. chrys/service/agent_middleware/events/hosted_tools.py +1762 -0
  814. chrys/service/agent_middleware/events/intermediate_text.py +128 -0
  815. chrys/service/agent_middleware/events/rejection_metadata.py +50 -0
  816. chrys/service/agent_middleware/events/result_persistence.py +98 -0
  817. chrys/service/agent_middleware/events/sub_agent_events.py +951 -0
  818. chrys/service/agent_middleware/events/tool_error_text.py +22 -0
  819. chrys/service/agent_middleware/events/tool_events.py +779 -0
  820. chrys/service/agent_middleware/injection.py +510 -0
  821. chrys/service/agent_middleware/reminders/__init__.py +91 -0
  822. chrys/service/agent_middleware/reminders/archive_pointer.py +154 -0
  823. chrys/service/agent_middleware/reminders/base.py +25 -0
  824. chrys/service/agent_middleware/reminders/context_usage.py +74 -0
  825. chrys/service/agent_middleware/reminders/file_change.py +63 -0
  826. chrys/service/agent_middleware/reminders/mcp.py +39 -0
  827. chrys/service/agent_middleware/reminders/profile_switch.py +106 -0
  828. chrys/service/agent_middleware/reminders/runtime_env.py +190 -0
  829. chrys/service/agent_middleware/reminders/skills.py +44 -0
  830. chrys/service/agent_middleware/reminders/sub_agents.py +35 -0
  831. chrys/service/agent_middleware/reminders/todo.py +35 -0
  832. chrys/service/agent_middleware/reminders/turn_line.py +48 -0
  833. chrys/service/agent_middleware/response_validation.py +1380 -0
  834. chrys/service/agent_middleware/system_reminder.py +1107 -0
  835. chrys/service/agent_middleware/validators.py +396 -0
  836. chrys/service/analytics/__init__.py +124 -0
  837. chrys/service/analytics/_actions.py +896 -0
  838. chrys/service/analytics/_context_evidence.py +357 -0
  839. chrys/service/analytics/_critical_path.py +179 -0
  840. chrys/service/analytics/_facts.py +919 -0
  841. chrys/service/analytics/_insights.py +769 -0
  842. chrys/service/analytics/_metric_ops.py +83 -0
  843. chrys/service/analytics/_session_projection.py +460 -0
  844. chrys/service/analytics/_timeline.py +434 -0
  845. chrys/service/analytics/_turn_graph.py +1237 -0
  846. chrys/service/analytics/_turns.py +1377 -0
  847. chrys/service/analytics/_workflows.py +171 -0
  848. chrys/service/analytics/aggregation.py +1474 -0
  849. chrys/service/analytics/classification.py +128 -0
  850. chrys/service/analytics/export.py +803 -0
  851. chrys/service/analytics/findings.py +282 -0
  852. chrys/service/analytics/math.py +79 -0
  853. chrys/service/analytics/model.py +886 -0
  854. chrys/service/analytics/reader.py +321 -0
  855. chrys/service/approval/__init__.py +3 -0
  856. chrys/service/approval/arbitration.py +102 -0
  857. chrys/service/approval/command_identity.py +109 -0
  858. chrys/service/approval/correlation.py +57 -0
  859. chrys/service/approval/grant_store.py +108 -0
  860. chrys/service/approval/judge.py +589 -0
  861. chrys/service/approval/level.py +15 -0
  862. chrys/service/approval/policy.py +209 -0
  863. chrys/service/approval/reuse.py +223 -0
  864. chrys/service/approval/reuse_binding.py +133 -0
  865. chrys/service/approval/safety_classifier.py +536 -0
  866. chrys/service/approval/turn_context.py +49 -0
  867. chrys/service/context/__init__.py +3 -0
  868. chrys/service/context/compaction/__init__.py +38 -0
  869. chrys/service/context/compaction/breaker.py +156 -0
  870. chrys/service/context/compaction/budgets.py +93 -0
  871. chrys/service/context/compaction/calibration.py +77 -0
  872. chrys/service/context/compaction/compression.py +690 -0
  873. chrys/service/context/compaction/current_turn_drop.py +458 -0
  874. chrys/service/context/compaction/events.py +201 -0
  875. chrys/service/context/compaction/exclusions.py +261 -0
  876. chrys/service/context/compaction/groups.py +361 -0
  877. chrys/service/context/compaction/last_words.py +1996 -0
  878. chrys/service/context/compaction/last_words_state.py +752 -0
  879. chrys/service/context/compaction/scoped.py +472 -0
  880. chrys/service/context/compaction/spill.py +1947 -0
  881. chrys/service/context/compaction/strategy.py +1116 -0
  882. chrys/service/context/compaction/summaries.py +319 -0
  883. chrys/service/context/compaction/turns.py +375 -0
  884. chrys/service/context/manager.py +174 -0
  885. chrys/service/context/memory_loader.py +792 -0
  886. chrys/service/context/middleware/__init__.py +3 -0
  887. chrys/service/context/middleware/usage.py +332 -0
  888. chrys/service/context/providers/__init__.py +3 -0
  889. chrys/service/context/providers/context_management.py +432 -0
  890. chrys/service/context/providers/history.py +647 -0
  891. chrys/service/context/providers/memory.py +50 -0
  892. chrys/service/context/tool_content.py +22 -0
  893. chrys/service/hooks/__init__.py +37 -0
  894. chrys/service/hooks/detached_worker.py +118 -0
  895. chrys/service/hooks/docs/README.md +14 -0
  896. chrys/service/hooks/docs/authoring.md +684 -0
  897. chrys/service/hooks/docs/configuration.md +499 -0
  898. chrys/service/hooks/docs/design.md +359 -0
  899. chrys/service/hooks/docs/project-hooks.md +348 -0
  900. chrys/service/hooks/events.py +157 -0
  901. chrys/service/hooks/loader.py +665 -0
  902. chrys/service/hooks/manager.py +807 -0
  903. chrys/service/hooks/matcher.py +111 -0
  904. chrys/service/hooks/outbox.py +294 -0
  905. chrys/service/hooks/runner.py +572 -0
  906. chrys/service/hooks/schema.py +407 -0
  907. chrys/service/llm/__init__.py +7 -0
  908. chrys/service/llm/_structured_outputs.py +192 -0
  909. chrys/service/llm/anthropic_messages/__init__.py +9 -0
  910. chrys/service/llm/anthropic_messages/client.py +254 -0
  911. chrys/service/llm/anthropic_messages/decode.py +331 -0
  912. chrys/service/llm/anthropic_messages/history.py +279 -0
  913. chrys/service/llm/anthropic_messages/request.py +323 -0
  914. chrys/service/llm/anthropic_messages/server_tools.py +319 -0
  915. chrys/service/llm/anthropic_messages/stream.py +297 -0
  916. chrys/service/llm/anthropic_messages/thinking_binding.py +156 -0
  917. chrys/service/llm/chat_completions/__init__.py +9 -0
  918. chrys/service/llm/chat_completions/client.py +369 -0
  919. chrys/service/llm/chat_completions/decode.py +338 -0
  920. chrys/service/llm/chat_completions/history.py +657 -0
  921. chrys/service/llm/chat_completions/reasoning.py +244 -0
  922. chrys/service/llm/chat_completions/request.py +192 -0
  923. chrys/service/llm/chat_completions/stream.py +546 -0
  924. chrys/service/llm/chat_completions/validation.py +308 -0
  925. chrys/service/llm/clients.py +613 -0
  926. chrys/service/llm/images.py +65 -0
  927. chrys/service/llm/mock.py +413 -0
  928. chrys/service/llm/observer.py +446 -0
  929. chrys/service/llm/one_shot.py +106 -0
  930. chrys/service/llm/openai_exceptions.py +93 -0
  931. chrys/service/llm/openai_responses/__init__.py +10 -0
  932. chrys/service/llm/openai_responses/client.py +323 -0
  933. chrys/service/llm/openai_responses/decode.py +432 -0
  934. chrys/service/llm/openai_responses/history.py +519 -0
  935. chrys/service/llm/openai_responses/hosted.py +625 -0
  936. chrys/service/llm/openai_responses/replay.py +629 -0
  937. chrys/service/llm/openai_responses/request.py +342 -0
  938. chrys/service/llm/openai_responses/stream.py +847 -0
  939. chrys/service/llm/openai_timestamps.py +57 -0
  940. chrys/service/llm/providers.py +107 -0
  941. chrys/service/llm/proxy_route.py +54 -0
  942. chrys/service/llm/raw_http_log.py +309 -0
  943. chrys/service/llm/route_facts.py +63 -0
  944. chrys/service/llm/route_sessions.py +49 -0
  945. chrys/service/llm/sdk_anthropic.py +18 -0
  946. chrys/service/llm/sdk_headers.py +47 -0
  947. chrys/service/llm/sdk_openai.py +18 -0
  948. chrys/service/llm/sdk_retry.py +59 -0
  949. chrys/service/llm/wire_client.py +246 -0
  950. chrys/service/mcp/__init__.py +3 -0
  951. chrys/service/mcp/_connection.py +235 -0
  952. chrys/service/mcp/_http_transport.py +350 -0
  953. chrys/service/mcp/_progressive.py +459 -0
  954. chrys/service/mcp/_stdio_transport.py +614 -0
  955. chrys/service/mcp/_tool_mixins.py +96 -0
  956. chrys/service/mcp/adapter.py +1031 -0
  957. chrys/service/mcp/cache.py +476 -0
  958. chrys/service/mcp/content.py +32 -0
  959. chrys/service/mcp/errors.py +169 -0
  960. chrys/service/mcp/owned.py +1330 -0
  961. chrys/service/mcp/result_limits.py +168 -0
  962. chrys/service/mcp/thinking_warning.py +95 -0
  963. chrys/service/mcp/validation.py +74 -0
  964. chrys/service/mutations/__init__.py +84 -0
  965. chrys/service/mutations/coordination.py +894 -0
  966. chrys/service/mutations/detector.py +458 -0
  967. chrys/service/mutations/git_calibrator.py +397 -0
  968. chrys/service/mutations/git_state.py +647 -0
  969. chrys/service/mutations/pipeline.py +779 -0
  970. chrys/service/mutations/scanner.py +466 -0
  971. chrys/service/mutations/snapshot_files.py +233 -0
  972. chrys/service/mutations/store.py +625 -0
  973. chrys/service/mutations/tool_names.py +15 -0
  974. chrys/service/mutations/trace.py +246 -0
  975. chrys/service/mutations/tracker.py +1289 -0
  976. chrys/service/mutations/types.py +559 -0
  977. chrys/service/mutations/workspace_changes.py +1583 -0
  978. chrys/service/profiles/__init__.py +2 -0
  979. chrys/service/profiles/agents/__init__.py +3 -0
  980. chrys/service/profiles/agents/builtins/Code.yaml +199 -0
  981. chrys/service/profiles/agents/builtins/Explore.yaml +62 -0
  982. chrys/service/profiles/agents/builtins/General.yaml +114 -0
  983. chrys/service/profiles/agents/builtins/QA.yaml +128 -0
  984. chrys/service/profiles/agents/loader.py +808 -0
  985. chrys/service/profiles/agents/registry.py +727 -0
  986. chrys/service/profiles/agents/schema.py +371 -0
  987. chrys/service/profiles/agents/serializer.py +196 -0
  988. chrys/service/profiles/coercion.py +22 -0
  989. chrys/service/profiles/models/__init__.py +3 -0
  990. chrys/service/profiles/models/env_bridge.py +157 -0
  991. chrys/service/profiles/models/loader.py +282 -0
  992. chrys/service/profiles/models/options.py +438 -0
  993. chrys/service/profiles/models/registry.py +104 -0
  994. chrys/service/profiles/models/resolver.py +286 -0
  995. chrys/service/profiles/models/schema.py +91 -0
  996. chrys/service/profiles/models/serializer.py +76 -0
  997. chrys/service/session/__init__.py +3 -0
  998. chrys/service/session/checkpoint.py +156 -0
  999. chrys/service/session/history.py +1616 -0
  1000. chrys/service/session/message_metadata.py +151 -0
  1001. chrys/service/session/persistence.py +435 -0
  1002. chrys/service/session/runtime_metadata.py +210 -0
  1003. chrys/service/session/sub_agent_logs.py +1069 -0
  1004. chrys/service/session/sub_agent_transcript.py +654 -0
  1005. chrys/service/skills/__init__.py +3 -0
  1006. chrys/service/skills/adapter.py +408 -0
  1007. chrys/service/skills/constants.py +8 -0
  1008. chrys/service/skills/loader.py +575 -0
  1009. chrys/service/skills/model.py +130 -0
  1010. chrys/service/skills/provider.py +841 -0
  1011. chrys/service/skills/runner.py +390 -0
  1012. chrys/service/state/__init__.py +3 -0
  1013. chrys/service/state/_fork.py +710 -0
  1014. chrys/service/state/_session_files.py +175 -0
  1015. chrys/service/state/_session_meta.py +552 -0
  1016. chrys/service/state/locks.py +154 -0
  1017. chrys/service/state/serializers.py +156 -0
  1018. chrys/service/state/session_catalog.py +361 -0
  1019. chrys/service/state/session_listing.py +84 -0
  1020. chrys/service/state/session_migration.py +446 -0
  1021. chrys/service/state/session_mru.py +315 -0
  1022. chrys/service/state/store.py +2132 -0
  1023. chrys/service/state/workflow.py +158 -0
  1024. chrys/service/text_blocks.py +47 -0
  1025. chrys/service/todos/__init__.py +3 -0
  1026. chrys/service/todos/reminder.py +31 -0
  1027. chrys/service/todos/tracker.py +58 -0
  1028. chrys/service/tools/__init__.py +3 -0
  1029. chrys/service/tools/approval_targets.py +92 -0
  1030. chrys/service/tools/builtins/__init__.py +3 -0
  1031. chrys/service/tools/builtins/ask_user.py +326 -0
  1032. chrys/service/tools/builtins/doc_converter/__init__.py +494 -0
  1033. chrys/service/tools/builtins/doc_converter/artifacts.py +392 -0
  1034. chrys/service/tools/builtins/doc_converter/parsers/__init__.py +3 -0
  1035. chrys/service/tools/builtins/doc_converter/parsers/_table.py +34 -0
  1036. chrys/service/tools/builtins/doc_converter/parsers/base.py +101 -0
  1037. chrys/service/tools/builtins/doc_converter/parsers/docx.py +88 -0
  1038. chrys/service/tools/builtins/doc_converter/parsers/pdf.py +144 -0
  1039. chrys/service/tools/builtins/doc_converter/parsers/pptx.py +103 -0
  1040. chrys/service/tools/builtins/doc_converter/parsers/xls.py +32 -0
  1041. chrys/service/tools/builtins/doc_converter/parsers/xlsx.py +51 -0
  1042. chrys/service/tools/builtins/doc_converter/registry.py +55 -0
  1043. chrys/service/tools/builtins/filesystem.py +1071 -0
  1044. chrys/service/tools/builtins/search.py +1265 -0
  1045. chrys/service/tools/builtins/shell.py +967 -0
  1046. chrys/service/tools/builtins/shell_command_filtering/__init__.py +5 -0
  1047. chrys/service/tools/builtins/shell_command_filtering/policy.py +60 -0
  1048. chrys/service/tools/builtins/shell_command_filtering/presets.py +152 -0
  1049. chrys/service/tools/builtins/shell_command_filtering/readonly/__init__.py +358 -0
  1050. chrys/service/tools/builtins/shell_command_filtering/readonly/commands.py +416 -0
  1051. chrys/service/tools/builtins/shell_command_filtering/readonly/git.py +408 -0
  1052. chrys/service/tools/builtins/shell_command_filtering/readonly/syntax.py +87 -0
  1053. chrys/service/tools/builtins/shell_command_filtering/tokenizer.py +214 -0
  1054. chrys/service/tools/builtins/shell_filter.py +24 -0
  1055. chrys/service/tools/builtins/sleep.py +91 -0
  1056. chrys/service/tools/builtins/todo.py +64 -0
  1057. chrys/service/tools/builtins/web/__init__.py +6 -0
  1058. chrys/service/tools/builtins/web/build.py +268 -0
  1059. chrys/service/tools/builtins/web/config.py +338 -0
  1060. chrys/service/tools/builtins/web/credentials.py +37 -0
  1061. chrys/service/tools/builtins/web/fetch/__init__.py +3 -0
  1062. chrys/service/tools/builtins/web/fetch/cache.py +68 -0
  1063. chrys/service/tools/builtins/web/fetch/convert.py +56 -0
  1064. chrys/service/tools/builtins/web/fetch/tool.py +223 -0
  1065. chrys/service/tools/builtins/web/hosted.py +61 -0
  1066. chrys/service/tools/builtins/web/http.py +330 -0
  1067. chrys/service/tools/builtins/web/progress.py +18 -0
  1068. chrys/service/tools/builtins/web/search/__init__.py +3 -0
  1069. chrys/service/tools/builtins/web/search/exa_mcp.py +146 -0
  1070. chrys/service/tools/builtins/web/search/html.py +152 -0
  1071. chrys/service/tools/builtins/web/search/json_api.py +227 -0
  1072. chrys/service/tools/builtins/web/search/providers.py +77 -0
  1073. chrys/service/tools/builtins/web/search/tool.py +218 -0
  1074. chrys/service/tools/builtins/web/search/types.py +28 -0
  1075. chrys/service/tools/builtins/web/tls_identity.py +66 -0
  1076. chrys/service/tools/kinds.py +115 -0
  1077. chrys/service/tools/names.py +47 -0
  1078. chrys/service/tools/registry.py +242 -0
  1079. chrys/service/tools/result_metadata.py +103 -0
  1080. chrys/service/tools/session_artifacts.py +196 -0
  1081. chrys/service/tools/spill.py +218 -0
  1082. chrys/service/tools/workspace_paths.py +81 -0
  1083. chrys/service/trajectory/__init__.py +11 -0
  1084. chrys/service/trajectory/approvals.py +201 -0
  1085. chrys/service/trajectory/compaction.py +420 -0
  1086. chrys/service/trajectory/fork.py +75 -0
  1087. chrys/service/trajectory/hooks.py +217 -0
  1088. chrys/service/trajectory/items.py +41 -0
  1089. chrys/service/trajectory/preparation.py +374 -0
  1090. chrys/service/trajectory/retries.py +95 -0
  1091. chrys/service/trajectory/revisions.py +129 -0
  1092. chrys/service/trajectory/segmented.py +163 -0
  1093. chrys/service/trajectory/session.py +762 -0
  1094. chrys/service/trajectory/state.py +83 -0
  1095. chrys/service/trajectory/sub_agents.py +169 -0
  1096. chrys/service/trajectory/tombstone.py +262 -0
  1097. chrys/service/trajectory/tools.py +323 -0
  1098. chrys/service/trajectory/validation.py +130 -0
  1099. chrys/service/trajectory/waits.py +161 -0
  1100. chrys/service/trajectory/workflow.py +148 -0
  1101. chrys/service/vision.py +128 -0
  1102. chrys/service/workflows/__init__.py +3 -0
  1103. chrys/service/workflows/admission.py +151 -0
  1104. chrys/service/workflows/artifacts.py +109 -0
  1105. chrys/service/workflows/asks.py +130 -0
  1106. chrys/service/workflows/builtins/__init__.py +12 -0
  1107. chrys/service/workflows/builtins/demo-workflow.manifest.json +635 -0
  1108. chrys/service/workflows/builtins/demo-workflow.py +756 -0
  1109. chrys/service/workflows/discovery.py +554 -0
  1110. chrys/service/workflows/environment.py +284 -0
  1111. chrys/service/workflows/graph.py +430 -0
  1112. chrys/service/workflows/history.py +82 -0
  1113. chrys/service/workflows/interpreter.py +107 -0
  1114. chrys/service/workflows/journal.py +334 -0
  1115. chrys/service/workflows/layout.py +56 -0
  1116. chrys/service/workflows/ledger.py +149 -0
  1117. chrys/service/workflows/model_selection.py +18 -0
  1118. chrys/service/workflows/orphans.py +209 -0
  1119. chrys/service/workflows/outcomes.py +46 -0
  1120. chrys/service/workflows/protocol.py +210 -0
  1121. chrys/service/workflows/records.py +142 -0
  1122. chrys/service/workflows/scheduler.py +770 -0
  1123. chrys/service/workflows/sdk/__init__.py +51 -0
  1124. chrys/service/workflows/sdk/_ask.py +167 -0
  1125. chrys/service/workflows/sdk/_builder.py +781 -0
  1126. chrys/service/workflows/sdk/_values.py +92 -0
  1127. chrys/service/workflows/sdk_artifact.py +74 -0
  1128. chrys/service/workflows/store.py +494 -0
  1129. chrys/service/workflows/transcript.py +102 -0
  1130. chrys/service/workflows/values.py +73 -0
  1131. chrys/service/workflows/worker_host.py +1820 -0
  1132. chrys/workflows.py +38 -0
  1133. icode_tui-0.29.1.dist-info/METADATA +104 -0
  1134. icode_tui-0.29.1.dist-info/RECORD +1138 -0
  1135. icode_tui-0.29.1.dist-info/WHEEL +4 -0
  1136. icode_tui-0.29.1.dist-info/entry_points.txt +2 -0
  1137. icode_tui-0.29.1.dist-info/licenses/LICENSE +202 -0
  1138. icode_tui-0.29.1.dist-info/licenses/NOTICE +1955 -0
@@ -0,0 +1,77 @@
1
+ # 管理与恢复会话
2
+
3
+ 会话包含对话历史及相关数据,例如回滚快照、诊断日志等。iCode 会自动保存会话,以便稍后恢复对话或查询历史任务。本指南介绍如何在终端用户界面(Terminal User Interface,TUI)中切换、命名、查找、恢复和删除会话,以及更换存储位置时如何迁移已有会话。
4
+
5
+ ## 切换到新会话
6
+
7
+ 智能体空闲时,根据是否需要保留当前会话的记录,在输入栏中使用对应命令:
8
+
9
+ | 目的 | 命令 | 对当前会话的影响 |
10
+ | --- | --- | --- |
11
+ | 开始新会话,稍后仍可恢复当前会话 | `/new` | 保留,可从会话列表恢复 |
12
+ | 开始新会话,不再保留当前会话 | `/clear` | 显示确认对话框,确认后永久删除,无法恢复 |
13
+
14
+ ## 修改会话标题
15
+
16
+ 可以通过以下任一方式修改当前会话的标题:
17
+
18
+ - 点击主界面左上角的“会话:…”区域,打开“会话标题”窗口,输入标题并点击“保存”。
19
+ - 在输入栏中输入 `/rename`,打开“会话标题”窗口,输入标题并点击“保存”。
20
+ - 在 `/rename` 后直接输入标题,例如 `/rename 修复登录问题`。
21
+
22
+ 手动设置标题后,新标题会显示在会话列表和主界面中,iCode 将不再自动更新该会话的标题。若已开启[自动生成会话标题](../configuration/settings.md#会话),清空“会话标题”窗口中的内容并保存后,iCode 会恢复已有的自动标题,并在后续任务中继续自动更新。
23
+
24
+ ## 恢复已有会话
25
+
26
+ 智能体空闲时,在输入栏中输入 `/resume`,可恢复最近的聊天会话。
27
+
28
+ 需要查找和恢复其他会话时,按 **F1**、点击 `f1 会话` 或在输入栏中输入 `/sessions`,打开“聊天会话”窗口。窗口会列出会话 ID、标题、目录、最近活跃时间、对话轮次数和会话数据大小。每页最多显示 100 个会话,最近活跃的排在前面。
29
+
30
+ - **按最后使用位置筛选**:搜索框上方的“TUI”“CLI”“ACP”复选框分别对应最后在 TUI 中、通过 [`icode run`](../running/icode-run.md),或在通过 [`icode acp`](../running/icode-acp.md) 连接的编辑器等客户端中使用的会话。默认只勾选“TUI”。旧版本 iCode 保存的会话按 TUI 处理。所做选择在退出 iCode 前一直保留。将鼠标悬停在会话上,可查看它最后在哪里使用。
31
+ - **翻页**:点击复选框右侧的“上一页”或“下一页”。
32
+ - **会话排序**:会话默认按最近活跃时间从新到旧排列。点击列标题可按该列对当前页排序:“最近活跃”“轮次”和“大小”首次点击时降序排列,其他列首次点击时升序排列。再次点击同一列标题可反转顺序。
33
+ - **搜索会话**:要查找会话,可在底部搜索框中输入会话 ID、标题、目录或曾经输入的提示词。搜索只在当前页中进行。
34
+ - **恢复会话**:选择目标会话后点击“恢复”;也可以双击目标会话,或使用上下方向键选择后按回车。iCode 会关闭当前对话视图,加载所选会话,并将工作目录切换到该会话保存时的主工作目录;当前会话仍会保存在列表中。恢复前可通过列表中的“目录”列核对将要恢复的工作目录。如果该目录已不存在,iCode 会请你选择另一个文件夹,详见[工作目录被删除或移动时](workspaces.md#工作目录被删除或移动时)。
35
+
36
+ 恢复较长的对话时,iCode 会先显示最近的内容,可立即继续操作;更早的消息会在随后几秒内陆续加载到上方。
37
+
38
+ 如果恢复的对话改用了与之前不同的模型服务,部分早先的推理内容可能会被略去,详见[切换当前模型配置](../configuration/models.md#切换当前模型配置)。
39
+
40
+ ## 删除旧会话
41
+
42
+ 打开“聊天会话”窗口,先核对会话 ID、目录和最近活跃时间。不确定时,可以先恢复会话确认内容,再返回“聊天会话”窗口。选择不再需要的会话,点击“删除”。
43
+
44
+ 确认删除后,该会话的对话历史、回滚快照和会话内诊断数据等内容会被永久删除,无法恢复。删除会话不会撤销智能体已对工作目录文件做出的修改。
45
+
46
+ 删除当前会话时,iCode 会同时开始新会话,与 `/clear` 类似。其他 iCode 实例正在使用的会话无法删除,请先关闭该实例。
47
+
48
+ ## 查找会话 ID 和会话保存位置
49
+
50
+ 当前会话 ID 显示在主界面左上角的“会话:…”区域;历史会话 ID 显示在“聊天会话”窗口的列表中。
51
+
52
+ 输入 `/settings sessions`,或按 **F10** 后选择“会话”标签页,“会话存储根目录”下方的“使用中”会显示当前实际使用的 `sessions` 目录。每个会话保存在该目录下以会话 ID 命名的子目录中。
53
+
54
+ 未自定义会话存储根目录时,macOS 和 Linux 的 `sessions` 目录默认为 `~/.chrys/sessions`,Windows 默认为 `%APPDATA%\chrys\sessions`。
55
+
56
+ ## 迁移会话存储位置
57
+
58
+ 更换会话存储位置时,需要设置新的会话存储根目录,并将已有会话迁移到新位置。新位置在重启后生效;仅修改存储位置不会自动迁移已有会话。
59
+
60
+ 开始前,结束当前任务并关闭其他 iCode 实例,然后执行以下操作:
61
+
62
+ 1. 输入 `/settings sessions`,或按 **F10** 后选择“会话”标签页,然后在“会话存储根目录”中选择新的根目录。
63
+ 2. 点击“迁移会话”。确认“从”是当前使用的 `sessions` 目录,“到”是新根目录下的 `sessions` 目录,然后点击“迁移”。
64
+ 3. 等待迁移完成,并根据结果处理未复制的会话:
65
+
66
+ | 结果 | 说明 | 后续操作 |
67
+ | --- | --- | --- |
68
+ | 已复制 | 会话已复制到目标目录。 | 无需处理。 |
69
+ | 已存在 | 目标中已有同一会话 ID,因此跳过。iCode 不会比较或更新目标内容。 | 无法确认目标版本时,建议更换空的目标目录重新迁移,或保留源数据。 |
70
+ | 使用中 | 会话正在某个 iCode 实例中打开,因此跳过。 | 关闭其他实例后重试。若是当前会话,关闭设置窗口并执行 `/new`;不要在新会话中发送消息,然后再次迁移。 |
71
+ | 忙碌 | 会话正在保存或被其他操作占用,因此跳过。 | 等待相关操作结束后重试。 |
72
+ | 失败 | 会话复制失败。 | 根据窗口列出的路径和原因处理权限或路径问题后重试。 |
73
+
74
+ 4. 处理“使用中”“忙碌”或“失败”的会话后,点击“关闭”,再点击“迁移会话”重新迁移(每次迁移完成后“迁移”按钮会被禁用),直到需要保留的会话均已复制。
75
+ 5. 关闭所有 iCode 实例并重新启动,再按 **F1** 打开“聊天会话”窗口,确认重要会话已经出现并可以恢复。
76
+
77
+ 迁移完成后,源目录会保留原数据,不会自动删除。确认迁移完整后,如需释放空间,关闭 iCode,再归档或删除迁移窗口中“从”所显示的旧 `sessions` 目录。手工删除无法撤销。
@@ -0,0 +1,51 @@
1
+ # 工作目录
2
+
3
+ 工作目录是 iCode 执行文件操作和命令时使用的默认目录。在让智能体修改文件前,建议先保存尚未写入磁盘的内容,并使用 Git commit 记录已有变更,以便区分智能体所做的修改,并在需要时恢复到修改前的状态。
4
+
5
+ ## 启动时选择工作目录
6
+
7
+ 在终端中进入项目目录并启动 iCode:
8
+
9
+ ```shell
10
+ cd <project-directory>
11
+ icode
12
+ ```
13
+
14
+ iCode 会将启动时所在的目录作为工作目录。
15
+
16
+ 也可以通过 `-C` 或 `--workdir` 选项指定工作目录,无需先进入项目目录:
17
+
18
+ ```shell
19
+ icode -C <project-directory>
20
+ ```
21
+
22
+ ## 在会话中切换工作目录
23
+
24
+ 智能体空闲时,可以点击对话区底部边框右侧显示的当前工作目录路径,或在输入栏中输入 `/chdir`,打开“更改目录”窗口。在窗口中浏览并选择目标目录。如需新建文件夹,先点击要放置它的文件夹,再点击“新建文件夹”,输入名称后按 Enter,新文件夹会被自动选中。若目标工作目录最近使用过,可在“收藏”标签页的“最近”分组中选择。
25
+
26
+ 已知目标路径时,在输入栏中输入以下命令可直接切换:
27
+
28
+ ```text
29
+ /chdir <project-directory>
30
+ ```
31
+
32
+ `<project-directory>` 可以是绝对路径,也可以是相对于当前工作目录的路径。如果目标不存在或不是目录,iCode 会提示错误并保留当前工作目录。
33
+
34
+ 切换完成后,对话区底部边框右侧会显示新的工作目录路径。智能体后续的文件读取、命令和其他操作会以新工作目录作为默认位置。
35
+
36
+ 切换工作目录时,iCode 会重新加载当前智能体,并加载新工作目录中的记忆和 Skills(其中的 Skills 仅在勾选“加载项目 Skills”时加载)。具体配置方式参阅[配置记忆](../configuration/memory.md)和[安装和使用 Skills](../extensions/skills.md)。
37
+
38
+ 切换工作目录不会创建新会话,当前对话历史仍会保留。处理无关项目时,建议先输入 `/new` 创建新会话,再在新会话中切换工作目录,避免在原会话中留下工作目录变更记录或混用不同项目的上下文。
39
+
40
+ ## 工作目录被删除或移动时
41
+
42
+ 如果在 iCode 之外(例如在文件管理器或另一个终端中)删除或移动了工作目录,iCode 将无法继续使用它:
43
+
44
+ - 正在执行的任务会继续运行。需要使用工作目录的命令和文件操作会失败,智能体会告诉你该目录已不存在。
45
+ - 任务结束时,或你发送消息时,iCode 会弹出“工作文件夹不存在”窗口。点击“选择文件夹…”并选择一个文件夹,“更改目录”窗口会定位到仍然存在的最近一级文件夹。iCode 会切换到所选文件夹,并保留当前对话。
46
+ - 你发送的消息会保留在输入栏中,切换后再次发送即可。
47
+ - 如果关闭窗口而未选择文件夹,下次发送消息时窗口会再次弹出。也可以使用 `/chdir` 切换,或将文件夹移回原来的位置。
48
+
49
+ 恢复的会话所保存的工作目录已不存在时,iCode 会请你选择一个文件夹来打开该会话。取消后不会恢复该会话;如果是通过 `-s` 启动 iCode,则会改为创建新会话。
50
+
51
+ 如果在已不存在的目录中启动 iCode,iCode 会提示错误并退出。请进入一个存在的目录,或使用 `-C` 指定项目目录的完整路径,例如 `icode -C ~/projects/my-app`。
@@ -0,0 +1,126 @@
1
+ # 配置外部 ACP 智能体
2
+
3
+ 本指南介绍如何在终端用户界面(Terminal User Interface,TUI)中接入支持智能体客户端协议(Agent Client Protocol,ACP)的外部智能体,并将其添加为主智能体的子智能体。
4
+
5
+ **外部 ACP 智能体可以作为子智能体或工作流节点使用,不能作为聊天主智能体**。每次调用外部 ACP 智能体时,iCode 都会为本次调用启动外部智能体进程,并通过 ACP 与其通信。任务处理和工具调用由外部智能体负责,审批请求、执行状态、进度更新和最终结果通过 ACP 连接传递。调用结束后,iCode 会关闭连接并终止该进程。
6
+
7
+ ## 准备外部智能体
8
+
9
+ 配置外部智能体前,请确认其满足以下条件:
10
+
11
+ - 已安装在运行 iCode 的设备上;
12
+ - 支持通过标准输入输出(stdio)运行 ACP 服务;
13
+ - 已完成必要的登录或认证,或已准备好认证所需的环境变量;
14
+ - 可以通过可执行文件及参数启动 ACP 模式。
15
+
16
+ 无需提前启动 ACP 服务。测试连接或调用子智能体时,iCode 会根据配置自动启动外部智能体进程,并通过 stdio 建立 ACP 连接。
17
+
18
+ 首次配置前,建议参考外部智能体的文档,准备以下信息:
19
+
20
+ - 启动 ACP 模式所需的可执行文件和参数;
21
+ - 所需的认证信息;
22
+ - 可选的会话模式、模型和其他配置项。
23
+
24
+ 其中,会话模式、模型和其他配置项可以在首次配置时填写,也可以在连接成功后根据测试结果补充。
25
+
26
+ ## 创建配置并测试连接
27
+
28
+ ### 创建外部 ACP 智能体配置
29
+
30
+ 1. 打开“智能体配置”窗口。
31
+ 2. 点击“新建”,填写名称、显示名称和描述。
32
+ 3. 将“智能体类型”改为“外部 ACP”。iCode 会自动将其设置为“仅用作子智能体”。
33
+ 4. 打开“ACP 设置”标签页,在“可执行文件”中填写程序名称或路径,并逐项添加启动参数。
34
+ 5. 按需添加认证所需的环境变量。外部智能体不会继承 iCode 的环境变量,需要在此添加,详见[使用环境变量](#使用环境变量)。
35
+ 6. “会话模式”“模型 ID”和“配置选项”可以暂时留空,完成基础配置后点击“测试”。
36
+
37
+ “可执行文件”和“参数”需要分开填写。例如,若启动命令为:
38
+
39
+ ```text
40
+ example-agent acp --model example-model
41
+ ```
42
+
43
+ 应将 `example-agent` 填入“可执行文件”,并分别将 `acp`、`--model` 和 `example-model` 添加为启动参数。不要将整条命令填写到“可执行文件”中。
44
+
45
+ > **注意**
46
+ >
47
+ > 将自定义智能体的“智能体类型”从“内置”改为“外部 ACP”时,除名称、显示名称和描述等基本信息外,原有配置会被清除。若需要保留原配置,请新建外部 ACP 智能体。
48
+
49
+ ### 测试连接
50
+
51
+ 测试连接时,iCode 会启动一个临时外部智能体进程,检查能否建立 ACP 会话,但不会发送任务。连接成功后,报告会显示身份、能力、模式、模型、配置选项和认证方式等栏目,并列出外部智能体提供的信息;未提供的信息可能显示“未声明。”“智能体未报告其身份信息。”或留空,这不表示连接失败。
52
+
53
+ 测试结束后,iCode 会关闭该临时进程。
54
+
55
+ 如果连接失败,请依次检查:
56
+
57
+ - 错误信息和标准错误输出末尾是否说明缺少依赖、参数错误或认证失败;
58
+ - 可执行文件和启动参数是否正确;
59
+ - 认证信息或环境变量是否有效;
60
+ - 配置的工作目录是否存在且允许访问。
61
+
62
+ ### 示例:将 iCode 配置为外部 ACP 智能体
63
+
64
+ iCode 自身也可以通过 stdio 提供 ACP 服务。可以使用以下配置:
65
+
66
+ - “可执行文件”:`icode`
67
+ - “参数”:添加 `acp`
68
+
69
+ 以上配置对应启动命令:
70
+
71
+ ```bash
72
+ icode acp
73
+ ```
74
+
75
+ 该命令会启动 iCode ACP 服务,默认提供 `Code` 智能体,并使用 `manual` 审批模式。有关 iCode ACP 服务的更多配置和使用说明,请参阅[使用 iCode ACP 服务](../running/icode-acp.md)。
76
+
77
+ ## 使用环境变量
78
+
79
+ 外部智能体不会继承 iCode 运行环境中的环境变量。它启动时只带有一组基本变量(macOS 和 Linux 上为 `HOME`、`LOGNAME`、`PATH`、`SHELL`、`TERM` 和 `USER`;Windows 上为 `APPDATA`、`HOMEDRIVE`、`HOMEPATH`、`LOCALAPPDATA`、`PATH`、`PATHEXT`、`PROCESSOR_ARCHITECTURE`、`SYSTEMDRIVE`、`SYSTEMROOT`、`TEMP`、`USERNAME` 和 `USERPROFILE`),以及智能体配置中设置的环境变量。智能体所需的其他变量,例如 API 密钥或 `HTTPS_PROXY` 等代理设置,请在配置中作为环境变量添加。
80
+
81
+ 在可执行文件、参数、环境变量值和工作目录中,可以使用 `{{ENV_VAR}}` 引用 iCode 运行环境中的环境变量,从而复用已有配置值,避免在智能体配置中直接填写固定值或敏感信息。环境变量名只能包含字母、数字和下划线,且不能以数字开头。
82
+
83
+ 例如,若 API 密钥保存在 `EXTERNAL_AGENT_API_KEY` 环境变量中,可以将外部智能体所需环境变量的值设置为:
84
+
85
+ ```text
86
+ {{EXTERNAL_AGENT_API_KEY}}
87
+ ```
88
+
89
+ 保存配置、测试连接以及每次启动外部智能体时,iCode 都会解析引用的环境变量。若对应环境变量不存在或值为空,配置将无法保存,测试连接或调用也会失败。
90
+
91
+ ## 设置工作目录
92
+
93
+ “工作目录”留空时,外部智能体使用 iCode 当前会话的工作目录。
94
+
95
+ “工作目录”可以填写相对路径或绝对路径;相对路径以当前会话的工作目录为基准。
96
+
97
+ 默认情况下,外部智能体的工作目录必须位于当前会话的主工作目录或任一附加工作目录内。若要使用上述目录范围之外的目录,请勾选“允许 cwd 位于工作区外”。此选项只放宽目录校验,不会改变外部智能体的文件权限。启用前,请确认外部智能体程序可信,并检查目标目录是否包含敏感文件。
98
+
99
+ ## 调整外部智能体配置
100
+
101
+ 首次测试连接成功后,可以根据测试报告进一步完善外部智能体配置:
102
+
103
+ - **会话模式**:设置外部智能体的会话模式。填写测试报告中列出的模式 ID。
104
+ - **模型 ID**:指定外部智能体使用的模型。填写测试报告中列出的模型 ID。此设置不影响主智能体使用的模型。
105
+ - **配置选项**:设置外部智能体提供的其他配置项。填写测试报告中对应的配置项 ID 和值。
106
+
107
+ 以上配置项均可留空。留空时,iCode 将使用外部智能体的默认配置。修改配置后,请重新测试连接。
108
+
109
+ 默认情况下,如果外部智能体不支持指定的会话模式或配置选项,连接测试会失败。若希望忽略不支持的设置并继续连接,请启用“尽力应用模式和配置选项”。
110
+
111
+ “模型 ID”按尽力方式应用。如果外部智能体未列出指定模型,或以“不支持的方法”或“参数无效”错误拒绝切换,iCode 会继续使用外部智能体的默认模型;切换模型时出现其他错误则连接失败。
112
+
113
+ ## 设置结果和超时
114
+
115
+ “结果”决定主智能体收到的内容:
116
+
117
+ - **最后一个消息片段**:只返回外部智能体最后一段回复,适合大多数任务。
118
+ - **完整记录**:返回外部智能体在本次调用中发送的所有消息片段,适合需要查看完整回复过程的任务。
119
+
120
+ “握手超时(秒)”限制启动进程、完成 ACP 初始化和打开会话所等待的时间。“空闲超时(秒;0 表示禁用)”限制调用期间未收到任何活动时的等待时间;设为 `0` 时不限制空闲等待时间。“测试”按钮不使用“握手超时(秒)”,始终最多等待 15 秒;启动较慢的智能体可能测试失败,但实际调用时仍可正常工作。
121
+
122
+ ## 将外部 ACP 智能体添加到主智能体
123
+
124
+ 保存外部智能体配置后,按照[为智能体配置子智能体](../configuration/agents.md#为智能体配置子智能体)中的步骤,将其添加到主智能体。
125
+
126
+ 在“配置”下拉列表中,外部 ACP 智能体的名称带有 `(ACP)` 标记。选择对应的配置并保存即可。
@@ -0,0 +1,167 @@
1
+ # 配置和编写 Hooks
2
+
3
+ 钩子(Hooks)用于在指定事件发生时自动运行本地脚本或命令。例如,可以在一轮任务结束后记录结果、在工具运行前检查参数,或在用户提交消息时为模型补充要求。
4
+
5
+ 本指南通过一个简单的示例,介绍如何编写和配置钩子,并提供几个可以按需修改的常用示例。完整的事件列表、配置字段、默认值以及脚本的输入输出格式,请参阅 [Hooks 配置参考](../../reference/hooks.md)。
6
+
7
+ > **安全提示**
8
+ >
9
+ > 钩子直接使用当前用户的权限运行,不经过工具审批,也不受安全沙箱限制。启用项目自带的钩子前,请检查其配置文件以及运行的脚本和命令。
10
+ >
11
+ > 钩子可能接收对话内容、工具参数和工具运行结果。若钩子会将这些数据发送到外部服务,请注意检查其中是否包含敏感信息。
12
+
13
+ ## 创建第一个钩子
14
+
15
+ 下面将在 iCode 当前会话的工作目录中创建一个项目钩子。它只对当前工作目录生效,并会在每一轮结束后将轮次状态追加到该目录下的 `hook-events.log`。
16
+
17
+ ### 1. 创建配置
18
+
19
+ 创建 `.chrys/hooks/hooks.yaml`:
20
+
21
+ ```yaml
22
+ hooks:
23
+ - id: record-turn
24
+ event: after_turn
25
+ run:
26
+ type: script
27
+ path: scripts/record_turn.py
28
+ ```
29
+
30
+ `id` 是钩子的稳定标识,在同一个配置文件中不能重复;这里将它命名为 `record-turn`。
31
+
32
+ 这项配置在 `after_turn` 事件发生时运行 `scripts/record_turn.py`。相对脚本路径以钩子配置文件所在目录为基准,因此这里指向下一步创建的 `.chrys/hooks/scripts/record_turn.py`。
33
+
34
+ ### 2. 创建脚本
35
+
36
+ 创建 `.chrys/hooks/scripts/record_turn.py`:
37
+
38
+ ```python
39
+ import json
40
+ import os
41
+ from pathlib import Path
42
+
43
+ with open(os.environ["CHRYS_HOOK_PAYLOAD_FILE"], encoding="utf-8") as payload_file:
44
+ payload = json.load(payload_file)
45
+
46
+ with Path("hook-events.log").open("a", encoding="utf-8") as log_file:
47
+ log_file.write(f"turn={payload['turn']} status={payload['status']}\n")
48
+ ```
49
+
50
+ iCode 通过 `CHRYS_HOOK_PAYLOAD_FILE` 环境变量提供本次事件的 JSON 输入文件。`after_turn` 事件的输入包含 `turn` 和 `status`,分别表示轮次编号和结束状态。脚本默认在 iCode 当前会话的工作目录中运行,所以 `hook-events.log` 也会写到工作目录。
51
+
52
+ ### 3. 加载并验证
53
+
54
+ 项目钩子默认不加载。在终端用户界面(Terminal User Interface,TUI)中按 **F10** 打开“设置”,在“安全”-“项目信任”区域勾选“加载项目钩子”。如果已经勾选,切换会话或重启 iCode,使磁盘上的配置生效。
55
+
56
+ 在 TUI 中输入 `/runtime`,打开“钩子”标签页,应能看到 `record-turn`。提交一条消息并等待当前轮结束后,检查工作目录中的 `hook-events.log`。文件应出现类似内容:
57
+
58
+ ```text
59
+ turn=1 status=ok
60
+ ```
61
+
62
+ ## 示例:按工具参数阻止操作
63
+
64
+ 需要在工具运行前检查或拒绝操作时,使用 `before_tool_call` 事件和阻塞式执行。下面的示例阻止文件写入工具修改名为 `.env` 的文件。
65
+
66
+ 先把以下条目加入 `.chrys/hooks/hooks.yaml` 的 `hooks` 列表:
67
+
68
+ ```yaml
69
+ - id: protect-env
70
+ event: before_tool_call
71
+ match:
72
+ tool_kind: filesystem.write
73
+ args:
74
+ path:
75
+ regex: "(^|[\\\\/])\\.env$"
76
+ run:
77
+ type: script
78
+ path: scripts/protect_env.py
79
+ execution:
80
+ mode: blocking
81
+ timeout_seconds: 5
82
+ on_error: block
83
+ ```
84
+
85
+ 这段配置只匹配具有 `path` 参数,并且路径以 `.env` 结尾的 `filesystem.write` 工具调用。阻塞式钩子会在 iCode 继续处理调用前完成。
86
+
87
+ 然后创建 `.chrys/hooks/scripts/protect_env.py`:
88
+
89
+ ```python
90
+ import json
91
+ import os
92
+
93
+ with open(os.environ["CHRYS_HOOK_RESULT"], "w", encoding="utf-8") as result_file:
94
+ json.dump(
95
+ {"action": "block", "reason": "不允许通过文件写入工具修改 .env"},
96
+ result_file,
97
+ ensure_ascii=False,
98
+ )
99
+ ```
100
+
101
+ 脚本通过 `CHRYS_HOOK_RESULT` 指定的结果文件返回 `action: block` 和拒绝原因。脚本打印到标准输出或标准错误的内容不作为操作决定读取,iCode 对两者各最多保留 256 KiB(开头和结尾)。
102
+
103
+ `on_error: block` 表示脚本无法启动、超时或返回非零退出码时也拒绝工具调用,适合需要失败时保持限制的检查。这个钩子只会阻止匹配的 `filesystem.write` 调用;Shell 命令不受影响。
104
+
105
+ 切换会话或重启 iCode 后,先创建一个专门用于验证的 `hook-demo/.env`,写入已知内容,例如 `HOOK_TEST=unchanged`。然后要求智能体仅使用 `write_file` 或 `edit_file` 尝试修改一次,被拒绝后停止,不使用 Shell 或其他方式。检查该工具调用是否在执行前被拒绝,并显示脚本提供的原因;再确认文件内容保持不变。验证后可以删除 `hook-demo/.env`。
106
+
107
+ ## 示例:为模型添加系统提醒
108
+
109
+ `user_prompt_submit` 钩子可以在用户提交消息时,为模型补充要求或提示。下面的示例只对 Code 智能体生效,并提醒它在修改 Python 文件后运行项目测试。
110
+
111
+ 先把以下条目加入 `.chrys/hooks/hooks.yaml` 的 `hooks` 列表:
112
+
113
+ ```yaml
114
+ - id: remind-python-tests
115
+ event: user_prompt_submit
116
+ match:
117
+ profile: Code
118
+ run:
119
+ type: script
120
+ path: scripts/remind_python_tests.py
121
+ execution:
122
+ mode: blocking
123
+ timeout_seconds: 5
124
+ ```
125
+
126
+ 然后创建 `.chrys/hooks/scripts/remind_python_tests.py`:
127
+
128
+ ```python
129
+ import json
130
+ import os
131
+
132
+ with open(os.environ["CHRYS_HOOK_RESULT"], "w", encoding="utf-8") as result_file:
133
+ json.dump(
134
+ {"system_reminder": "修改 Python 文件后,运行与改动相关的测试。"},
135
+ result_file,
136
+ ensure_ascii=False,
137
+ )
138
+ ```
139
+
140
+ 切换会话或重启 iCode,使配置生效。系统提醒只有在阻塞式钩子成功结束后才会生效。iCode 会用 `<system-reminder>` 标签包住提醒内容,随用户提交的消息一起发送给模型。这段提醒不会显示在 TUI 对话中,也不会写入会话数据。
141
+
142
+ 如需确认 `user_prompt_submit` 钩子是否生效,或查看系统提醒发送给模型时的实际内容,可以检查模型请求的原始 HTTP 日志。该日志包含未脱敏的 API 密钥和完整对话内容,应仅在排查问题时临时启用。在 TUI 中按 **F10**,进入“安全”-“诊断”,开启“捕获原始 HTTP 流量”,然后重启 iCode。使用 Code 智能体提交一条消息后,在当前会话目录的 `llm_raw_http.jsonl` 中搜索提醒正文“修改 Python 文件后”。当前会话目录的位置参阅[查找会话 ID 和会话保存位置](../daily-use/sessions.md#查找会话-id-和会话保存位置)。验证完成后,应关闭原始 HTTP 流量捕获并再次重启 iCode。
143
+
144
+ 如果只想在部分任务中添加提醒,可以让脚本读取 `CHRYS_HOOK_PAYLOAD_FILE` 中的 `text`(用户刚提交的消息),并只在消息符合条件时向 `CHRYS_HOOK_RESULT` 写入 `system_reminder`。
145
+
146
+ ## 选择运行方式
147
+
148
+ 多数钩子只需根据“当前操作是否必须等待结果”选择执行方式:
149
+
150
+ | 需求 | 建议模式 | 行为 |
151
+ | --- | --- | --- |
152
+ | 在操作继续前检查、拒绝或修改操作 | `blocking` | iCode 等待钩子结束;部分事件会采用结果文件中的操作决定 |
153
+ | 不阻塞当前操作,但希望 iCode 在当前轮或会话结束时等待一段时间 | `async` | iCode 立即继续,之后在适用的事件和等待上限内等待钩子完成 |
154
+ | 普通通知或允许被退出打断的记录任务 | `fire_and_forget` | iCode 立即继续,结束当前轮或会话时也不等待;这是默认模式 |
155
+
156
+ 异步钩子(`async`)不会延迟触发它的事件或当前操作。当前轮或会话结束时,如果相应的异步钩子仍在运行,iCode 会等待它完成后再结束当前轮或会话。`user_interrupt` 触发的异步钩子不会被等待。会话结束时的等待上限可在[全局设置](../../reference/hooks.md#全局设置)中配置。需要在 iCode 退出后重试未完成的任务时,还应配置 `delivery: durable`。
157
+
158
+ ## 使用全局钩子
159
+
160
+ 前面的示例都放在当前工作目录的 `.chrys/hooks` 中,只对该工作目录生效。需要在所有工作目录使用同一个钩子时,可以改用全局配置:
161
+
162
+ | 平台 | 全局配置文件 |
163
+ | --- | --- |
164
+ | macOS 和 Linux | `~/.chrys/hooks/hooks.yaml` |
165
+ | Windows | `%APPDATA%\chrys\hooks\hooks.yaml` |
166
+
167
+ 项目配置和全局配置可以同时加载。两处钩子的执行顺序、同名 ID 和 `settings` 合并规则见[多个钩子的执行顺序与配置合并](../../reference/hooks.md#多个钩子的执行顺序与配置合并)。
@@ -0,0 +1,95 @@
1
+ # 连接 MCP 服务器
2
+
3
+ 模型上下文协议(Model Context Protocol,MCP)服务器可以为 iCode 智能体提供外部工具、提示词模板和使用说明。本指南介绍如何在终端用户界面(Terminal User Interface,TUI)中连接 HTTP 或 STDIO MCP 服务器、配置可调用的工具,以及控制是否加载提示词模板、是否将服务器使用说明加入模型上下文。
4
+
5
+ 连接 MCP 服务器前,请确认服务器来源可信。服务器可能接收工具调用参数,并访问本机文件、网络服务或账号数据;其提供的提示词模板和使用说明也可能影响智能体的行为。
6
+
7
+ ## 添加 MCP 服务器配置
8
+
9
+ 在输入栏中输入 `/agents mcp`,打开当前智能体的“MCP”标签页。添加的服务器配置只对当前智能体生效,不会自动应用到其他智能体。
10
+
11
+ 每个服务器对应一张卡片。已保存的服务器默认折叠,只显示名称;点击名称可展开或折叠。保存时如果发现问题,有问题的卡片会自动展开。要删除服务器,点击卡片上的“✕”并确认。
12
+
13
+ 点击“+ 添加”,然后在列表顶部新增的卡片中填写以下字段:
14
+
15
+ 1. 填写“服务器名称”。名称用于在当前智能体的 MCP 配置中标识该服务器。同一个智能体的 MCP 配置中,服务器名称不能重复,且不区分大小写。
16
+ 2. 可选填写“描述”,用于备注服务器的用途。该描述不会作为服务器使用说明提供给智能体。
17
+
18
+ HTTP 请求头值和 STDIO 环境变量值都可以使用 `{{ENV_VAR}}` 引用启动 iCode 前已经设置的环境变量。环境变量名只能包含字母、数字和下划线,且不能以数字开头。
19
+
20
+ 接下来,根据服务器的连接方式完成 HTTP 或 STDIO 设置。
21
+
22
+ ### 使用 HTTP 连接
23
+
24
+ 1. 将“传输方式”设为 `HTTP`。
25
+ 2. 填写服务器 URL。URL 必须以 `http://` 或 `https://` 开头。
26
+ 3. 如果服务器需要认证,在“请求头”中添加名称和值。可以用 `{{ENV_VAR}}` 引用启动 iCode 前已经设置的环境变量,例如:
27
+
28
+ ```text
29
+ 名称:Authorization
30
+ 值:Bearer {{MCP_API_TOKEN}}
31
+ ```
32
+
33
+ 4. 如果当前网络要求该服务器不经过系统代理,启用“绕过代理”。
34
+ 5. 建议保持 TLS 证书验证开启。如果需要连接已确认可信的自签名服务器,可以启用“跳过 TLS 验证”。启用后,iCode 不会验证 HTTPS 服务器证书,无法确认连接的是预期服务器。
35
+
36
+ ### 使用 STDIO 连接
37
+
38
+ 1. 将“传输方式”设为 `STDIO`。
39
+ 2. 在“命令”中填写用于启动服务器的程序名称或路径以及所需参数。TUI 会将这行内容拆分并分别保存到智能体 YAML 的 `command` 和 `args` 字段;手工编辑 YAML 时,应将可执行文件写入 `command`,将参数逐项写入 `args`。
40
+ 3. 按需添加该进程需要的环境变量。变量值可以直接填写,也可以用 `{{ENV_VAR}}` 引用启动 iCode 前已经设置的环境变量。
41
+
42
+ STDIO 连接会在本机启动指定程序。如果启动命令会下载或运行第三方软件包或脚本,应先确认其来源可信并检查相关内容。
43
+
44
+ ## 配置说明、工具和请求选项
45
+
46
+ 以下设置同时适用于 HTTP 和 STDIO 服务器。
47
+
48
+ ### 服务器说明与提示词模板
49
+
50
+ - **将服务器使用说明加入模型上下文(如有)**:新建配置默认启用。启用后,服务器说明会加入模型上下文,并可能影响智能体的行为。
51
+ - **将服务器提示词模板加载为工具(如有)**:新建配置默认启用。启用后,服务器提供的提示词模板会作为可调用工具加入模型工具列表。
52
+
53
+ ### 工具访问
54
+
55
+ - **可用工具范围**:控制允许智能体使用的服务器工具。可以选择“全部服务器工具”、“仅选定工具”或“无工具”。
56
+
57
+ 选择“仅选定工具”时,填写以 `,` 分隔的工具名称列表。如果还不清楚服务器提供的工具名称,可以先选择“全部服务器工具”,再按照[测试并保存](#测试并保存)中的步骤从连接报告查看工具名称。
58
+
59
+ ### 工具加载
60
+
61
+ - **加载策略**:控制工具何时提供给智能体。选择“全部加载 — 一开始就加载全部可用工具”时,“可用工具范围”内的所有工具在任务开始时即可使用。选择“按需加载 — 需要时再加载工具”时,任务开始时仅提供“初始可见工具(可选)”中的工具,智能体可在需要时加载“可用工具范围”内的其他工具。服务器提供的工具较多、常用工具较少时,按需加载可以减少任务开始时发送给模型的工具信息。
62
+ - **初始可见工具(可选)**:使用“按需加载 — 需要时再加载工具”时,可以填写以 `,` 分隔的工具名称列表。填写的工具必须包含在“可用工具范围”中。
63
+
64
+ 例如:
65
+
66
+ - 服务器只提供 `search` 和 `read_file`,并且两者经常使用,可以选择“全部加载 — 一开始就加载全部可用工具”。
67
+ - 服务器提供几十个工具,但通常只使用 `search` 和 `read_file`,可以选择“按需加载 — 需要时再加载工具”,并将这两个工具填入“初始可见工具(可选)”。
68
+
69
+ 使用 Claude Opus 5.5、Fable 5.1 或 Sonnet 5.5 时,按需加载有额外代价。这些模型会把返回的思考内容与它之前的对话绑定,包括智能体当时可用的工具。智能体加载或卸载工具,或下一个任务重新只从初始可见工具开始时,这部分对话就会变化,模型服务可能略去早先的思考内容,或拒绝读回这些内容。如果服务拒绝,iCode 会去掉早先的思考内容,再发送一次请求,这会多发一次请求。无论是服务略去,还是 iCode 去掉后重发,模型都不再看到那部分早先的推理。设为 `thinking_block_binding: error` 时,iCode 会直接报告这次拒绝,不会重发。相关设置详见 [Claude 思考设置](../configuration/models.md#claude-思考设置)。
70
+
71
+ ### 命名与限制
72
+
73
+ - **工具名称前缀**:为该服务器的工具名称添加前缀,并使用 `_` 连接前缀与原名称。例如,前缀 `github` 会将工具 `search` 显示为 `github_search`。不同服务器或内置工具存在同名工具时,可以用前缀避免冲突。
74
+ - **MCP 请求超时(秒)**:限制单次 MCP 请求等待时间;留空时使用界面显示的默认值。
75
+
76
+ ## 测试并保存
77
+
78
+ 1. **启用/停用服务器**:如需启用 MCP 服务器,保持勾选配置卡片左下角的“启用”选项。如需保留配置但暂时停用服务器,取消勾选该选项。停用后,服务器不会向智能体提供工具、提示词模板或使用说明。
79
+ 2. **测试服务器连接**:点击服务器配置卡片右下角的“测试”。iCode 会尝试连接服务器,并在连接报告中显示服务器身份、声明的能力和使用说明,以及当前配置下可用的工具和提示词模板。
80
+ 3. **保存配置**:点击“保存”。如果修改的是当前会话正在使用的智能体,保存后的 MCP 配置会用于后续请求。
81
+
82
+ 如果测试失败:
83
+
84
+ - HTTP 服务器应检查 URL、认证请求头、环境变量以及代理和 TLS 设置。
85
+ - STDIO 服务器应先查看连接错误中显示的可执行文件、工作目录、进程退出码和标准错误输出末尾,再核对命令、参数和环境变量,并确认命令能在所示工作目录中启动。iCode 只显示有限长度的标准错误输出;需要完整日志时,请按照服务器文档启用日志记录。分享诊断信息前,请移除令牌、凭据等敏感信息。
86
+
87
+ ## 验证 MCP 工具调用
88
+
89
+ 关闭智能体配置窗口,提交一项需要使用该服务器工具的低风险任务。例如,如果服务器提供只读搜索工具,可以要求智能体搜索一条明确的数据。
90
+
91
+ 对话中应显示对应的 MCP 工具调用卡片,并返回服务器提供的数据。若弹出“工具审批”对话框,请先核对工具名称和调用参数,再决定是否批准。有关审批方式,请参阅[配置审批模式](../configuration/approval.md)。
92
+
93
+ 如果工具返回的图像、音频或文件无法解码,智能体会收到一条简短说明代替该项,结果的其余内容照常送达。工具返回的链接会以文字(名称、地址和描述)交给智能体。
94
+
95
+ 如果连接测试成功,但对话中工具不可用,请检查服务器是否已启用、工具是否出现在连接报告中,以及是否包含在“可用工具范围”中。