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,548 @@
1
+ # 智能体配置文件参考
2
+
3
+ 智能体配置文件(Agent Profile)是保存在本机的 YAML 文件,用于定义智能体的名称、指令、模型、工具、审批策略、Skills、记忆、上下文压缩和子智能体。本页列出 YAML 文件的加载与修改规则,以及可用字段、默认值和约束。
4
+
5
+ 如需通过终端用户界面(Terminal User Interface,TUI)配置智能体,参阅[配置智能体](../guides/configuration/agents.md)。需要手工编辑 YAML 时,以本页为准。
6
+
7
+ ## 用户智能体配置目录
8
+
9
+ 用户智能体配置文件保存在以下目录:
10
+
11
+ | 平台 | 目录 |
12
+ | --- | --- |
13
+ | macOS、Linux | `~/.chrys/agents/` |
14
+ | Windows | `%APPDATA%\chrys\agents\` |
15
+
16
+ iCode 只加载目录中扩展名为 `.yaml` 或 `.yml` 的非隐藏文件,其他文件会被忽略。无效配置不会阻止其他配置加载,但会被跳过,并在启动日志中记录警告。
17
+
18
+ iCode 在启动时加载这些文件。手工新增、修改或删除配置文件后,更改会在下次启动 iCode 时生效。
19
+
20
+ ## 配置文件命名和规范化
21
+
22
+ 每个配置必须包含 `name`。`name` 用作配置文件名,因此必须是合法的跨平台文件名,不能包含路径分隔符、冒号、控制字符或 `* ? " < > |` 中的任一字符,也不能使用 `.`、`..` 或 Windows 保留设备名。加载时会移除 `name` 两端的空白。
23
+
24
+ 加载用户配置时,iCode 会根据配置内容规范化文件:
25
+
26
+ - 文件名不是 `<name>.yaml` 时,iCode 会将其重命名为 `<name>.yaml`。这也会将 `.yml` 扩展名改为 `.yaml`。
27
+ - 配置缺少 `id` 时,iCode 会分配稳定 ID,并重写整个文件。重写后不会保留原有注释、字段顺序和格式,还会移除无法识别的键和取默认值的字段(`approval` 除外,它始终会写入)。
28
+ - `sub_agents.agents` 引用了已从 iCode 中移除的内置智能体时,iCode 会删除这些条目,并以同样方式重写文件。如果你有同名的自有配置,则保留这些引用;目录中有配置文件加载失败时,此项修改会推迟。
29
+ - 目标文件名已被其他配置占用时,该配置不会加载。iCode 会尽可能将冲突文件重命名为带 `.conflict` 标记的文件。
30
+
31
+ 上述规范化过程可能重命名或重写文件。需要保留原文件时,请在加载前备份。
32
+
33
+ 发生冲突时,检查 `<name>.yaml` 和带 `.conflict` 标记的文件,并保留需要的配置。如需同时保留两者,将其中一个文件改为新的独立配置:修改 `name`,删除原有的 `id`,并将文件扩展名恢复为 `.yaml`。重启后,iCode 会为该配置分配新 ID。
34
+
35
+ 受文件系统限制时,iCode 可能无法添加 `.conflict` 标记。此时冲突文件会保留原名,但仍不会加载。
36
+
37
+ ## 覆盖内置智能体
38
+
39
+ 内置智能体的原始配置随 iCode 安装。通过 TUI 修改并保存内置智能体后,iCode 会在[用户智能体配置目录](#用户智能体配置目录)中生成同名配置文件。例如,修改并保存名称为 `Code` 的内置智能体后会生成 `Code.yaml`。
40
+
41
+ 内置智能体的 `name` 包括 `Code`、`QA`、`Explore` 和 `General`。在用户智能体配置目录下手工创建的配置文件使用上述任一 `name` 时,也会覆盖对应的内置智能体。覆盖配置会完整替代内置配置,不会继承或合并内置配置中的其他字段。删除对应的用户配置文件并重启 iCode,即可恢复使用内置配置。
42
+
43
+ ## 基础配置示例
44
+
45
+ 配置必须包含 `name` 字段,用于标识智能体配置。建议同时填写 `display_name`、`description` 和 `instructions`,以便识别配置和明确智能体行为。以下示例定义了一个用于代码审查的智能体:
46
+
47
+ ```yaml
48
+ name: Reviewer
49
+ display_name: 代码审查
50
+ description: 检查代码质量和潜在缺陷
51
+ instructions: |
52
+ 阅读相关代码和测试。
53
+ 优先报告会影响用户的缺陷,并给出文件位置。
54
+ tools:
55
+ builtins:
56
+ - filesystem.read
57
+ - search
58
+ ```
59
+
60
+ 示例省略了 `id`。iCode 首次加载配置时会分配稳定 ID 并回写文件。
61
+
62
+ 将上述配置保存为[用户智能体配置目录](#用户智能体配置目录)中的 `Reviewer.yaml`。运行以下命令,确认配置能够加载:
63
+
64
+ ```bash
65
+ icode agents
66
+ ```
67
+
68
+ 列表中出现“代码审查”,说明配置已加载。如果未出现,请检查启动时显示的 YAML 解析或字段校验警告,并确认文件位于用户智能体配置目录中。
69
+
70
+ ## 顶层字段说明
71
+
72
+ | 字段 | 类型 | 默认值 | 说明 |
73
+ | --- | --- | --- | --- |
74
+ | `name` | 字符串 | 必填 | 配置名称,也是规范文件名的主体。子智能体引用使用此值。 |
75
+ | `id` | 字符串 | 自动分配 | 稳定标识符。省略或留空时,iCode 会自动分配一个 12 位十六进制 ID:与内置智能体同名时沿用其 ID,否则生成新的 ID。也可以手动填写唯一 ID;纯数字 ID 需要加引号,例如 `id: "123"`,否则会被读取为数字,导致配置加载失败。复制已有配置文件并在其基础上修改以创建新的配置时,建议删除 `id` 字段,由 iCode 自动分配新的 ID。 |
76
+ | `display_name` | 字符串 | 空 | 显示名称。 |
77
+ | `description` | 字符串 | 空 | 说明智能体用途,也作为子智能体未填写工具描述时的默认描述。 |
78
+ | `sub_agent_only` | 布尔值 | `false` | 为 `true` 时不能选作主智能体,只能被其他智能体调用。外部 ACP 智能体会被强制设为 `true`。 |
79
+ | `instructions` | 字符串或字符串列表 | 空 | 提供给内置类型智能体的主要行为指令。写成列表时,各项按每项一行合成一段文本。外部 ACP 配置会忽略此字段。 |
80
+ | `model` | 对象 | `{}` | 绑定模型配置,见 [model](#model)。 |
81
+ | `tools` | 对象 | `{}` | 配置内置工具、MCP 和 Shell 过滤,见 [tools](#tools)。 |
82
+ | `approval` | 对象 | 见下文 | 配置哪些工具调用需要审批,见 [approval](#approval)。 |
83
+ | `skills` | 对象 | 见下文 | 配置 Skill 来源和内嵌 Skill,见 [skills](#skills)。 |
84
+ | `memory` | 对象 | `{}` | 配置自动加载的参考文件,见 [memory](#memory)。 |
85
+ | `compaction` | 对象 | 见下文 | 配置上下文压缩,见 [compaction](#compaction)。 |
86
+ | `sub_agents` | 对象 | 见下文 | 配置可调用的子智能体,见 [sub_agents](#sub_agents)。 |
87
+ | `acp` | 对象 | 未启用 | 字段一旦出现,该配置即为外部智能体客户端协议(Agent Client Protocol,ACP)智能体,见 [acp](#acp)。空对象 `acp: {}` 或空值(`acp:`、`acp: null`)也会启用此类型,但没有 `command` 时无法启动。 |
88
+
89
+ ## model
90
+
91
+ `model` 用于将智能体绑定到指定的模型配置。
92
+
93
+ ```yaml
94
+ model:
95
+ profile_id: 0123456789ab
96
+ ```
97
+
98
+ | 字段 | 类型 | 默认值 | 说明 |
99
+ | --- | --- | --- | --- |
100
+ | `profile_id` | 字符串 | 空 | 要绑定的模型配置 ID。 |
101
+
102
+ 省略 `profile_id`、将其留空,或者填写的 ID 在已加载的模型配置中找不到时,主智能体使用会话中当前生效的模型配置,子智能体继承父智能体实际使用的模型配置。ID 找不到时,iCode 还会记录警告。
103
+
104
+ 运行 `icode models` 可以在 `ID` 列查看模型配置的稳定 ID。模型配置方法参阅[配置模型](../guides/configuration/models.md)。
105
+
106
+ ## tools
107
+
108
+ ```yaml
109
+ tools:
110
+ builtins:
111
+ - filesystem.read
112
+ - search
113
+ - shell
114
+ mcp: []
115
+ ```
116
+
117
+ | 字段 | 类型 | 默认值 | 说明 |
118
+ | --- | --- | --- | --- |
119
+ | `builtins` | 字符串列表 | `[]` | 要启用的内置工具类别,可用值见[类别和名称概览](./tool-kinds-and-names.md#类别和名称概览)中“内置”为“是”的行。内置智能体都不包含 `web_search` 和 `web_fetch`。 |
120
+ | `mcp` | 对象列表 | `[]` | 模型上下文协议(Model Context Protocol,MCP)服务器配置,见 [tools.mcp](#toolsmcp)。 |
121
+ | `shell_filter` | 字符串或对象 | 未设置(不进行 Shell 过滤) | 限制 Shell 工具可以执行的命令,见 [tools.shell_filter](#toolsshell_filter)。 |
122
+ | `web_search` | 对象 | 未设置(使用用户设置) | `web_search` 工具的模式和搜索提供方,见 [tools.web_search](#toolsweb_search)。 |
123
+ | `web_fetch` | 对象 | 未设置(使用用户设置) | `web_fetch` 工具的模式和限制,见 [tools.web_fetch](#toolsweb_fetch)。 |
124
+
125
+ ### tools.mcp
126
+
127
+ 每个列表条目配置一个服务器。`name` 和 `transport` 必填;同一智能体配置内的 `name` 不能重复,且重复判断不区分大小写。HTTP 连接需要 `url`,STDIO 连接需要 `command`。
128
+
129
+ STDIO 配置示例:
130
+
131
+ ```yaml
132
+ tools:
133
+ mcp:
134
+ - name: local-server
135
+ transport: stdio
136
+ command: python
137
+ args: ["-m", "example_mcp_server"]
138
+ env:
139
+ API_KEY: "{{MCP_API_KEY}}"
140
+ LOG_LEVEL: info
141
+ ```
142
+
143
+ HTTP 配置示例:
144
+
145
+ ```yaml
146
+ tools:
147
+ mcp:
148
+ - name: remote-server
149
+ transport: http
150
+ url: https://example.com/mcp
151
+ headers:
152
+ Authorization: "Bearer {{MCP_API_TOKEN}}"
153
+ ```
154
+
155
+ `env` 和 `headers` 都是键值映射:左侧填写变量名或请求头名称,右侧填写对应的值。值可以直接填写,也可以用 `{{ENV_VAR}}` 引用启动 iCode 前已设置的环境变量。`env` 中引用的变量缺失或为空时,服务器连接失败;`headers` 仅在 `resolve_header_templates` 为 `true` 时解析变量并应用这一规则。
156
+
157
+ | 字段 | 类型 | 默认值 | 适用范围 | 说明 |
158
+ | --- | --- | --- | --- | --- |
159
+ | `name` | 字符串 | 必填 | 通用 | 此配置中的服务器名称。 |
160
+ | `transport` | `http` 或 `stdio` | 必填 | 通用 | 连接方式。 |
161
+ | `enabled` | 布尔值 | `true` | 通用 | 是否连接并提供服务器能力。 |
162
+ | `description` | 字符串 | 空 | 通用 | 供用户识别配置的备注,不作为服务器说明发送给智能体。 |
163
+ | `tool_name_prefix` | 字符串 | 空 | 通用 | 给 MCP 工具的名称添加 `<前缀>_`。前缀只能包含字母、数字、下划线和连字符,必须以字母或数字开头和结尾,不能有首尾空白。添加前缀后的完整工具名不能超过 64 个字符。 |
164
+ | `allowed_tools` | 字符串列表或 `null` | `null` | 通用 | `null` 表示允许全部服务器工具,`[]` 表示不允许任何工具,列表表示只允许指定工具。 |
165
+ | `use_progressive_disclosure` | 布尔值 | `false` | 通用 | 为 `true` 时按需加载允许的工具。`allowed_tools` 为 `[]` 时不能设为 `true`。 |
166
+ | `always_load` | 字符串列表 | `[]` | 通用 | 按需加载时最初可见的工具。`allowed_tools` 为列表时,这些名称也必须在该列表中;未启用按需加载时必须为空。 |
167
+ | `load_prompts` | 布尔值 | `true` | 通用 | 是否将服务器提示词模板作为工具加载。 |
168
+ | `expose_instructions` | 布尔值 | `true` | 通用 | 是否将服务器使用说明加入模型上下文。 |
169
+ | `timeout` | 正整数或 `null` | `null` | 通用 | 单次 MCP 请求(包括工具调用)的超时秒数。`null` 使用默认值 30 秒。必须大于 `0`。 |
170
+ | `max_tool_result_tokens` | 整数或 `null` | `null` | 通用 | 单次远程工具文本结果上限。`null` 使用默认上限 `8000` 个词元,`0` 仅取消此项上限,正整数至少为 `100`;其他值会导致整个智能体配置被跳过。 |
171
+ | `command` | 字符串 | 空 | STDIO | 启动服务器的可执行文件名称或路径。YAML 中不要在此字段拼接参数。 |
172
+ | `args` | 字符串列表 | `[]` | STDIO | 传给服务器进程的参数。 |
173
+ | `env` | 字符串对象 | `{}` | STDIO | 传给服务器进程的环境变量。HTTP 配置会忽略此字段。 |
174
+ | `encoding` | 字符串或 `null` | `null` | STDIO | 服务器标准输入输出编码;通常留空。 |
175
+ | `url` | 字符串 | 空 | HTTP | 以 `http://` 或 `https://` 开头的服务器 URL。 |
176
+ | `headers` | 字符串对象 | `{}` | HTTP | HTTP 请求头。 |
177
+ | `resolve_header_templates` | 布尔值 | `true` | HTTP | 是否解析请求头值中的 `{{ENV_VAR}}`。设为 `false` 时按字面发送。 |
178
+ | `verify_ssl` | 布尔值 | `true` | HTTP | 是否验证 HTTPS 证书。关闭会降低连接安全性。 |
179
+ | `bypass_proxy` | 布尔值 | `false` | HTTP | 是否绕过环境变量配置的 HTTP/HTTPS 代理,直接连接服务器。 |
180
+ | `terminate_on_close` | 布尔值或 `null` | `null` | HTTP | 关闭连接时是否请求终止远程会话;`null` 使用默认值 `true`。 |
181
+
182
+ `allowed_tools` 和 `always_load` 填写服务器提供的原始工具名称。`tool_name_prefix` 会改变智能体调用工具时使用的名称;`approval.overrides` 也使用这个名称。名称生成规则见 [MCP 工具名称](./tool-kinds-and-names.md#mcp-工具名称)。如果填写的某个名称可能指两个工具(例如前缀为 `gh` 时,服务器的 `search` 工具会变成 `gh_search`,恰好是另一个工具的原始名称),智能体会加载失败。错误信息会指出这个名称,并为它匹配到的每个工具给出一个只对应该工具的名称:本例中服务器的 `search` 写 `search`,服务器的 `gh_search` 写 `gh_gh_search`。把这个名称换成你想让智能体使用的那些工具对应的名称。如果错误信息说没有名称能单独对应某个工具,请换一个 `tool_name_prefix`。
183
+
184
+ 启用按需加载时,iCode 还会添加用于查看、加载和卸载 MCP 工具的控制工具,名称规则见 [MCP 工具名称](./tool-kinds-and-names.md#mcp-工具名称)。此时,`tool_name_prefix` 不能超过 49 个字符。
185
+
186
+ 配置方法、连接测试和调用验证参阅[连接 MCP 服务器](../guides/extensions/mcp.md)。
187
+
188
+ ### tools.shell_filter
189
+
190
+ `shell_filter` 只对 `shell` 类别中的工具生效。省略此字段或设置为 `unrestricted` 时,iCode 不过滤 Shell 命令。
191
+
192
+ Shell 工具调用先经过[审批](#approval),放行后再由 `shell_filter` 检查具体命令;两项检查都通过后,命令才会执行。若命令被过滤器阻止,iCode 不会启动 Shell 进程,而是返回“命令被阻止”的工具错误。
193
+
194
+ `shell_filter` 可以使用预设,也可以自定义允许或阻止的命令。使用预设时,可以直接填写预设名称,也可以在对象中通过 `preset` 选择;两种写法效果相同:
195
+
196
+ ```yaml
197
+ tools:
198
+ shell_filter: read_only
199
+ ```
200
+
201
+ ```yaml
202
+ tools:
203
+ shell_filter:
204
+ preset: read_only
205
+ ```
206
+
207
+ 可用的预设如下:
208
+
209
+ | 值 | 行为 |
210
+ | --- | --- |
211
+ | `read_only` | 只允许内置命令名单中的命令,并阻止未被引号包围的重定向和命令替换。例如:`ls`、`cat`、`rg`、`git`、`python`、`curl` 和 PowerShell 的 `Get-Content` 等。不检查命令参数、子命令或脚本内容,因此不保证命令只读,也不是安全沙箱。 |
212
+ | `unrestricted` | 不进行 Shell 过滤。通常直接省略 `shell_filter` 即可。 |
213
+
214
+ 只有上表中的名称会启用预设。无法识别的预设不会生效:使用标量写法时不进行 Shell 过滤;使用对象写法时,iCode 会尝试使用同一对象中的自定义规则,若 `commands` 为空,同样不进行 Shell 过滤。
215
+
216
+ 需要自行指定允许或阻止的命令时,使用对象形式。例如:
217
+
218
+ ```yaml
219
+ tools:
220
+ shell_filter:
221
+ mode: whitelist
222
+ commands: [git, rg]
223
+ allow_redirections: false
224
+ allow_subshells: false
225
+ ```
226
+
227
+ 对象形式支持以下字段:
228
+
229
+ | 字段 | 类型 | 默认值 | 说明 |
230
+ | --- | --- | --- | --- |
231
+ | `preset` | `read_only`、`unrestricted` 或空 | 空 | 选择预设。设置为可用预设后,忽略其他自定义过滤字段。 |
232
+ | `mode` | `whitelist` 或 `blacklist` | `whitelist` | `whitelist` 只允许 `commands` 中的命令;`blacklist` 阻止 `commands` 中的命令,允许其他命令。 |
233
+ | `commands` | 字符串列表 | `[]` | 命令名名单。`whitelist` 模式下为允许名单,`blacklist` 模式下为阻止名单;必须至少包含一个命令,自定义过滤才会生效。为空时不进行 Shell 过滤。 |
234
+ | `allow_redirections` | 布尔值 | `true` | 是否允许未被引号包围的 `>`、`>>` 和 `<`。 |
235
+ | `allow_subshells` | 布尔值 | `true` | 是否允许未被引号包围的 `$()` 和反引号命令替换。 |
236
+
237
+ 在自定义规则中,`commands` 填写可执行文件名,例如 `[git, rg]`。名称区分大小写;使用绝对路径时需要填写完整路径。对于由 `|`、`&&`、`||` 或 `;` 等连接的多个命令,iCode 会分别检查每一段,所有命令名都符合规则后才会执行。以上示例允许 `rg foo .`;`rg foo . | less` 会被阻止,因为管道右侧的 `less` 不在允许名单中。
238
+
239
+ ### tools.web_search
240
+
241
+ `web_search` 字段配置 `web_search` 工具,仅在 `builtins` 包含 `web_search` 时生效。省略的字段使用[网络工具用户设置](./settings.md#网络工具)。配置步骤和各提供方的行为参阅[配置网络工具](../guides/configuration/web-tools.md)。
242
+
243
+ ```yaml
244
+ tools:
245
+ builtins: [filesystem.read, search, web_search]
246
+ web_search:
247
+ mode: auto
248
+ fallback_chain: [primary, backup]
249
+ num_results: 8
250
+ timeout_seconds: 30
251
+ providers:
252
+ primary:
253
+ type: tavily
254
+ api_key_env: TAVILY_API_KEY
255
+ backup:
256
+ type: duckduckgo_html
257
+ ```
258
+
259
+ | 字段 | 类型 | 默认值 | 说明 |
260
+ | --- | --- | --- | --- |
261
+ | `mode` | `auto`、`provider`、`off` 或布尔值 | 用户设置 `tools.web_search.mode`(`auto`) | `auto`:`provider`、`fallback_chain` 和 `providers` 均省略时使用 Exa 公开端点;配置了 `providers` 时必须设置 `fallback_chain`。`provider`:只使用 `provider` 指定的一个提供方,不能设置 `fallback_chain`。`off`:关闭网络搜索。`true` 表示 `auto`,`false` 表示 `off`。其他值会导致整个智能体配置被跳过。 |
262
+ | `provider` | 字符串 | 未设置 | `provider` 模式使用的提供方在 `providers` 中的 ID,不能与 `fallback_chain` 同时使用。 |
263
+ | `fallback_chain` | 字符串列表 | 未设置 | `auto` 模式下按顺序尝试的提供方 ID(均需在 `providers` 中),最多 5 个,不能重复。 |
264
+ | `providers` | 对象 | 未设置 | 以自定义 ID 为键的提供方配置。ID 以小写字母开头,只能包含小写字母、数字、`_` 和 `-`,最长 64 个字符。 |
265
+ | `num_results` | 整数 | 用户设置 `tools.web_search.num_results`(`8`) | 智能体未指定数量时每次搜索返回的结果数,范围 `1`–`20`。 |
266
+ | `timeout_seconds` | 整数 | 用户设置 `tools.web_search.timeout_seconds`(`30`) | 整个搜索调用的截止时间(秒),范围 `1`–`120`。 |
267
+
268
+ 数值超出范围或 `providers` 条目格式错误时,同样会导致该配置被跳过。与模式不符的组合(例如 `provider` 模式未设置 `provider`,或选用了 `providers` 中不存在的提供方)则会让智能体不包含网络工具,iCode 会显示一条写明原因的警告。
269
+
270
+ `providers` 中的每一项支持以下字段:
271
+
272
+ | 字段 | 适用于 | 说明 |
273
+ | --- | --- | --- |
274
+ | `type` | 全部 | 必填。无需密钥的服务为 `exa_mcp`、`bing_html` 或 `duckduckgo_html`;需要密钥的搜索 API 为 `tavily`、`brave` 或 `exa`;自己的端点为 `custom_http`。 |
275
+ | `api_key_env` | `tavily`、`brave`、`exa` | 必填。保存 API 密钥的环境变量名。这些类型不接受其他字段。 |
276
+ | `preset` | `custom_http` | `searxng` 或 `serpapi`,为对应服务自动填写请求和响应映射;`serpapi` 还会设置 `endpoint` 和 `auth`。自己填写的字段优先。 |
277
+ | `endpoint` | `custom_http` | 搜索端点 URL。还需在用户设置 `tools.web_search.custom_endpoints` 中授权该端点及其读取的每个环境变量。 |
278
+ | `method` | `custom_http` | `GET`(默认)或 `POST`。 |
279
+ | `auth` | `custom_http` | 对象,包含 `location`(`header`、`query` 或默认的 `none`)、`name`(请求头或查询参数名)、`key_env`(保存密钥的环境变量)和可选的 `prefix`(例如 `"Bearer "`)。`location` 为 `header` 时,`name` 必须是 `Authorization`、`X-API-Key` 或 `X-Subscription-Token`。 |
280
+ | `headers` | `custom_http` | 只能包含 `Accept` 和 `Content-Type`,且内容类型必须为 `application/json`。密钥应通过 `auth` 传递,不能写在请求头中。 |
281
+ | `request` | `custom_http` | `query_params`,以及 `POST` 时的 `json`。写成 `{$input: query}`、`{$input: limit}`、`{$input: allowed_domains}` 或 `{$input: blocked_domains}` 的值会替换为对应的搜索参数,`{$env: NAME}` 会替换为环境变量。 |
282
+ | `response` | `custom_http` | 指向响应内容的 JSON Pointer:`results_pointer` 和 `url_pointer`(未使用预设时必填),以及可选的 `title_pointer` 和 `snippet_pointer`。 |
283
+
284
+ `exa_mcp`、`bing_html` 和 `duckduckgo_html` 只接受 `type` 字段。
285
+
286
+ ### tools.web_fetch
287
+
288
+ `web_fetch` 字段配置 `web_fetch` 工具,仅在 `builtins` 包含 `web_fetch` 时生效。省略的字段使用[网络工具用户设置](./settings.md#网络工具)。
289
+
290
+ ```yaml
291
+ tools:
292
+ builtins: [filesystem.read, search, web_search, web_fetch]
293
+ web_fetch:
294
+ mode: on
295
+ max_tokens: 16000
296
+ timeout_seconds: 60
297
+ ```
298
+
299
+ | 字段 | 类型 | 默认值 | 说明 |
300
+ | --- | --- | --- | --- |
301
+ | `mode` | `on`、`off` 或布尔值 | 用户设置 `tools.web_fetch.mode`(`on`) | `on` 时 `web_fetch` 可用;`off` 时不提供。`true` 表示 `on`,`false` 表示 `off`。 |
302
+ | `max_tokens` | 整数 | 用户设置 `tools.web_fetch.max_tokens`(`16000`) | 读取的页面最多返回的词元数,范围 `1`–`64000`。智能体可以要求更少,但不能更多。 |
303
+ | `timeout_seconds` | 整数 | 用户设置 `tools.web_fetch.timeout_seconds`(`60`) | 整个网页读取调用的截止时间(秒),范围 `1`–`120`。 |
304
+
305
+ 网络访问(代理、来源列表和自定义端点授权)只能在用户设置中配置,不能写在智能体配置文件中。参阅设置文件参考中的[网络工具](./settings.md#网络工具)。
306
+
307
+ ## approval
308
+
309
+ `approval` 用于设置工具调用的**初始审批级别**。它与会话的**审批模式**不同:审批级别决定工具调用是否需要进入审批流程,审批模式决定进入审批流程后的处理方式。
310
+
311
+ | 字段 | 类型 | 说明 |
312
+ | --- | --- | --- |
313
+ | `default` | `auto`、`require` 或 `skip` | 未匹配覆盖规则时使用的审批级别。 |
314
+ | `overrides` | 对象 | 按工具类别或工具名称设置审批级别。 |
315
+
316
+ 未配置 `approval` 时,iCode 使用以下默认配置:
317
+
318
+ ```yaml
319
+ approval:
320
+ default: auto
321
+ overrides:
322
+ shell: require
323
+ filesystem.write: require
324
+ todo: skip
325
+ ```
326
+
327
+ ### 审批级别
328
+
329
+ 审批级别可使用以下值:
330
+
331
+ | 值 | 行为 |
332
+ | --- | --- |
333
+ | `require` | 工具调用初始需要审批。 |
334
+ | `auto`、`skip` | 工具调用初始无需审批。当前版本中两者行为相同。 |
335
+
336
+ 一次工具调用的处理流程如下:
337
+
338
+ 1. iCode 根据 `default` 和 `overrides` 确定初始审批级别。
339
+ 2. iCode 根据安全规则调整结果:
340
+
341
+ * 访问敏感目标的 Shell 命令和文件读写会调整为需要审批;
342
+ * 已知安全的只读 Shell 命令、工作目录 Git 仓库内的非敏感文件写入等操作可以直接执行。
343
+ 3. 如果调用仍需审批,则由当前会话的审批模式决定处理方式,包括用户确认、审批裁判模型判断或绕过审批。具体行为参阅[配置审批模式](../guides/configuration/approval.md)。
344
+
345
+ ### 覆盖规则
346
+
347
+ 工具类别和名称的区别、可用值及动态名称规则见[工具类别和名称](./tool-kinds-and-names.md)。
348
+
349
+ `overrides` 的键可以是:
350
+
351
+ * 工具类别,例如 `shell`;
352
+ * 工具名称,例如 `write_file`;
353
+ * 工具类别和工具名称组合,例如 `filesystem.write.write_file`。
354
+
355
+ 与工具类别相同的键始终表示该类别。如需指定名称与某个类别相同的工具(例如名为 `search` 的 MCP 工具),请使用工具类别和工具名称组合,例如 `mcp.search`。`web_search` 和 `web_fetch` 例外:这两个键同时匹配同名的任何工具(例如名为 `web_search` 的 MCP 工具),因此为此类工具编写的覆盖规则仍然有效。
356
+
357
+ 同一工具调用匹配多条规则时,按以下优先级选择:
358
+
359
+ 1. 工具类别和工具名称;
360
+ 2. 工具名称;
361
+ 3. 工具类别;
362
+ 4. `default`。
363
+
364
+ 规则在 YAML 中的顺序不影响匹配结果。例如:
365
+
366
+ ```yaml
367
+ approval:
368
+ default: auto
369
+ overrides:
370
+ filesystem.write: require
371
+ filesystem.write.write_file: auto
372
+ ```
373
+
374
+ 在此示例中:
375
+
376
+ * `write_file` 匹配 `filesystem.write.write_file`,审批级别为 `auto`;
377
+ * 其他文件写入工具匹配 `filesystem.write`,审批级别为 `require`;
378
+ * 其他工具使用 `default` 的 `auto`。
379
+
380
+ 省略 `overrides` 时,iCode 使用默认覆盖项 `shell: require`、`filesystem.write: require` 和 `todo: skip`。显式设置 `overrides: {}` 会清空这些默认覆盖项,未匹配其他规则的工具均使用 `default`。
381
+
382
+ Skill 脚本是例外:`run_skill_script` 默认需要审批。如需修改该行为,需要在 `overrides` 中显式配置 `skill`、`run_skill_script` 或 `skill.run_skill_script` 的审批级别。
383
+
384
+ 网络工具也是例外:`web_search` 和 `web_fetch` 类别的工具默认需要审批,即使 `default` 为 `auto`。该规则在 `overrides` 中的规则之后、`default` 之前生效。如需修改,在 `overrides` 中显式配置该类别或工具名称的审批级别,例如 `web_search: auto`。
385
+
386
+ ## skills
387
+
388
+ ```yaml
389
+ skills:
390
+ paths:
391
+ - ./team-skills
392
+ script_timeout: 300
393
+ script_extensions: [.py, .sh, .ps1]
394
+ auto_load_user_agents_skills: true
395
+ auto_load_cwd_agents_skills: true
396
+ inline:
397
+ - name: release-notes
398
+ description: 根据提交记录起草面向用户的发布说明
399
+ instructions: |
400
+ 读取变更并按新增、修复和兼容性变化分类。
401
+ resources:
402
+ - name: style-guide
403
+ description: 发布说明的写作规则
404
+ content: |
405
+ 使用简短标题,只描述用户可观察的变化。
406
+ ```
407
+
408
+ | 字段 | 类型 | 默认值 | 说明 |
409
+ | --- | --- | --- | --- |
410
+ | `paths` | 字符串列表 | `[]` | 额外的 Skill 搜索根目录。iCode 在每个目录及其最多两层子目录中查找 `SKILL.md`;找到后不再搜索该 Skill 目录的内部。相对路径按当前[工作目录](../guides/daily-use/workspaces.md)解析;路径开头的 `~` 由 iCode 展开为当前用户主目录。 |
411
+ | `inline` | 对象列表 | `[]` | 直接写在配置中的 Skill,见下文。 |
412
+ | `script_timeout` | 正整数 | `300` | Skill 脚本最长运行秒数。 |
413
+ | `script_extensions` | 字符串列表 | `[.py, .sh, .ps1]` | 允许作为 Skill 脚本运行的扩展名;所需解释器必须已经安装。 |
414
+ | `auto_load_user_agents_skills` | 布尔值 | `true` | 是否加载 Agent Skills 用户级共享目录。 |
415
+ | `auto_load_cwd_agents_skills` | 布尔值 | `true` | 是否加载当前工作目录的 `.agents/skills`;还需在设置中开启“加载项目 Skills”(`project.skills_enabled`)。切换工作目录后重新加载。 |
416
+
417
+ iCode 用户 Skill 目录始终加载;Agent Skills 用户级共享目录默认加载;当前工作目录 Skill 目录在设置中开启“加载项目 Skills”后加载。两者可分别通过两个 `auto_load_*` 字段关闭。用户级 Skill 目录路径见[Skill 安装位置](../guides/extensions/skills.md#skill-安装位置)。
418
+
419
+ 多个来源出现同名 Skill 时,优先级从高到低为:`paths` 中靠前的目录、iCode 用户 Skill 目录、Agent Skills 用户级共享目录、当前工作目录 Skill 目录、`inline` 中靠前的定义。同一个搜索根目录中存在多个同名 Skill 时,发现顺序不确定;为确保加载指定版本,请只保留其中一个。
420
+
421
+ > **注意**:Skill 脚本作为本地进程运行,不受安全沙箱隔离。将目录加入 `paths` 或启用自动加载来源前,请检查其中的 `SKILL.md`、脚本和其他相关文件,只加载可信 Skill。允许某种脚本扩展名不会自动安装对应解释器。
422
+
423
+ ### skills.inline
424
+
425
+ | 字段 | 类型 | 默认值 | 说明 |
426
+ | --- | --- | --- | --- |
427
+ | `name` | 字符串 | 必填 | 1~64 个字符,可使用小写字母、数字和连字符;连字符不能连续出现,也不能位于开头或结尾。 |
428
+ | `description` | 字符串 | 必填 | 非空,最长 1024 个字符。用于帮助智能体判断何时加载 Skill。 |
429
+ | `instructions` | 字符串或字符串列表 | 空 | Skill 加载后提供给智能体的操作说明。写成列表时,各项按每项一行合成一段文本。 |
430
+ | `resources` | 对象列表 | `[]` | 随 Skill 加载的内嵌文本资源,见下表。 |
431
+
432
+ | `resources` 子字段 | 类型 | 默认值 | 说明 |
433
+ | --- | --- | --- | --- |
434
+ | `name` | 字符串 | 必填 | 资源标识,不是文件路径;同一 Skill 内不要使用仅大小写不同的重复名称。 |
435
+ | `description` | 字符串 | 空 | 资源用途说明。 |
436
+ | `content` | 字符串 | 空 | 文本资源内容。内容为空的资源会被忽略。 |
437
+
438
+ 内嵌 Skill 不支持文件资源或脚本。需要引用文件或运行脚本时,应创建包含 `SKILL.md` 的目录 Skill,并通过 `skills.paths` 或上述自动加载的 Skill 目录加载。
439
+
440
+ Skill 的安装步骤、目录规范、加载验证和使用方式详见[安装和使用 Skills](../guides/extensions/skills.md)。
441
+
442
+ ## memory
443
+
444
+ ```yaml
445
+ memory:
446
+ files:
447
+ - AGENTS.md
448
+ - docs/project-context.md
449
+ folders:
450
+ - docs/reference
451
+ ```
452
+
453
+ | 字段 | 类型 | 默认值 | 说明 |
454
+ | --- | --- | --- | --- |
455
+ | `files` | 字符串列表 | `[]` | 单个 `.md` 或 `.txt` 文件。 |
456
+ | `folders` | 字符串列表 | `[]` | 扫描其中 `.md` 和 `.txt` 文件的目录。 |
457
+
458
+ 路径可以是绝对路径,也可以相对于当前工作目录;相对路径不能指向工作目录以外的位置。主智能体和工作流中的智能体节点会加载记忆;子智能体不会加载自身或父智能体的记忆。目录扫描深度、文件数和总词元上限参阅[配置记忆](../guides/configuration/memory.md)。
459
+
460
+ ## compaction
461
+
462
+ `compaction` 用于配置 iCode 压缩当前任务时生成的续接信息(Last Words);这些设置不影响较早工具结果或已完成对话轮次的压缩摘要。
463
+
464
+ ```yaml
465
+ compaction:
466
+ last_words_template: |
467
+ 优先保留复现步骤、关键日志和仍待验证的假设。
468
+ last_words_max_output_tokens: 20000
469
+ phase4_side_call_token_budget: -1
470
+ ```
471
+
472
+ | 字段 | 类型 | 默认值 | 说明 |
473
+ | --- | --- | --- | --- |
474
+ | `last_words_template` | 字符串 | 空 | 附加到 iCode 固定 Last Words 要求后的补充说明,用于强调当前任务中需要保留的信息,不会替换固定格式。 |
475
+ | `last_words_max_output_tokens` | 整数 | `20000` | Last Words 的最大输出词元数;运行时不会超过模型配置的输出上限。 |
476
+ | `phase4_side_call_token_budget` | 整数或 `null` | `-1` | 从用户提交消息到智能体完成本次回复期间,生成 Last Words 的额外模型请求可使用的估算输入词元总预算。`-1` 或 `null` 表示不限预算,`0` 表示不发起 Last Words 请求,正整数设置累计上限;不能小于 `-1`。 |
477
+
478
+ `last_words_max_output_tokens` 限制输出,`phase4_side_call_token_budget` 限制累计输入。后者主要用于严格控制额外模型用量,通常保留默认值。预算不足时,iCode 会保留当前任务内容;如果上下文仍然过大,本次任务可能无法继续。
479
+
480
+ `compaction` 不提供压缩触发阈值设置;iCode 会根据当前模型的上下文窗口、最大输出词元数和安全余量自动确定何时压缩。
481
+
482
+ 压缩流程和可见行为参阅[配置上下文压缩](../guides/configuration/compaction.md)。
483
+
484
+ ## sub_agents
485
+
486
+ ```yaml
487
+ sub_agents:
488
+ max_total_concurrency: 3
489
+ agents:
490
+ - profile: Explore
491
+ tool_name: explore
492
+ tool_description: 搜索并分析相关代码
493
+ max_concurrency: 3
494
+ ```
495
+
496
+ | 字段 | 类型 | 默认值 | 说明 |
497
+ | --- | --- | --- | --- |
498
+ | `max_total_concurrency` | 正整数 | `3` | 所有子智能体调用合计的最大并发数。 |
499
+ | `agents` | 对象列表 | `[]` | 可供当前智能体调用的配置。 |
500
+ | `agents[].profile` | 字符串 | 必填 | 已加载的智能体 `name`。不能引用自身,同一配置不能重复引用。缺少 `profile` 的条目会被忽略。 |
501
+ | `agents[].tool_name` | 字符串 | 子智能体 `name` | 暴露给父智能体的工具名称。显式填写的值必须以字母或下划线开头,之后只能包含字母、数字或下划线。省略时直接使用子智能体的 `name`。最终生效的名称在同一父智能体内不能重名。 |
502
+ | `agents[].tool_description` | 字符串 | 子智能体 `description` | 帮助父智能体判断何时调用。 |
503
+ | `agents[].max_concurrency` | 正整数 | `3` | 此子智能体的最大并发调用数。 |
504
+
505
+ TUI 的“智能体配置”窗口保存时会检查并发数和 `tool_name` 格式;加载手工编辑的 YAML 文件时不做这些检查。并发数为 `0` 或更小时,相应子智能体的每次调用都会失败。
506
+
507
+ 非 ACP 子智能体内部的工具调用使用父智能体的 `approval` 配置;子智能体自身的 `approval` 配置不影响这些调用。
508
+
509
+ 非 ACP 子智能体向父智能体返回最终回复,不包含其在工具调用之间输出的文本。最终回复无文本时,返回其输出的全部文本,按顺序拼接。ACP 子智能体返回的内容由 [`result_mode`](#acp) 决定。
510
+
511
+ 配置方法和调用验证参阅[配置智能体](../guides/configuration/agents.md#为智能体配置子智能体)。
512
+
513
+ ## acp
514
+
515
+ 顶层出现 `acp` 时,该配置会成为外部 ACP 智能体,并被强制设为仅用作子智能体。任务指令、模型和工具由外部进程决定。
516
+
517
+ 外部 ACP 智能体不使用当前配置中的 `instructions`、`model.profile_id`、`tools`、`skills`、`memory`、`compaction`、`approval` 和 `sub_agents`。这些设置不会影响外部智能体的行为。
518
+
519
+ ```yaml
520
+ name: ExternalReviewer
521
+ display_name: 外部审查智能体
522
+ description: 通过 ACP 调用外部审查程序
523
+ acp:
524
+ command: example-agent
525
+ args: [acp]
526
+ env:
527
+ API_KEY: "{{EXAMPLE_API_KEY}}"
528
+ result_mode: last_segment
529
+ ```
530
+
531
+ | 字段 | 类型 | 默认值 | 说明 |
532
+ | --- | --- | --- | --- |
533
+ | `command` | 字符串 | 空 | 可执行文件名称或路径。启动外部智能体时必填;空值可以被加载,但无法启动。不能包含 NUL,也不要把参数拼入此字段。 |
534
+ | `args` | 字符串列表 | `[]` | 逐项传给进程的参数;不能包含 NUL。 |
535
+ | `env` | 字符串对象 | `{}` | 传给进程的环境变量。名称须符合环境变量命名规则,忽略大小写后不得重复;`CHRYS_ACP_SUBAGENT_DEPTH` 保留给 iCode。 |
536
+ | `cwd` | 字符串 | 空 | 外部智能体的工作目录;留空时使用 iCode 当前会话的工作目录,相对路径也以该会话目录为基准解析。 |
537
+ | `allow_external_cwd` | 布尔值 | `false` | 是否允许外部智能体在当前会话的工作目录及其子目录之外运行。默认为 `false`,指定范围外的 `cwd` 会报错并拒绝启动,不会回退到默认目录。此选项只控制启动目录校验,不限制外部智能体的文件访问权限。 |
538
+ | `session_mode` | 字符串 | 空 | 请求外部智能体使用的会话模式 ID。 |
539
+ | `model_id` | 字符串 | 空 | 尽力请求外部智能体使用的模型 ID。 |
540
+ | `config_options` | 对象 | `{}` | 外部智能体配置项;键必须是非空字符串,值只能是字符串或布尔值。 |
541
+ | `best_effort_options` | 布尔值 | `false` | 是否忽略外部智能体不支持的会话模式和配置项并继续连接。 |
542
+ | `result_mode` | `last_segment` 或 `transcript` | `last_segment` | 向父智能体返回最后一个消息片段,或完整消息记录。 |
543
+ | `handshake_timeout_seconds` | 数字 | `30.0` | 启动、初始化和打开会话的超时秒数,必须大于 `0`。YAML 中无效值会回退到默认值并记录警告。 |
544
+ | `idle_timeout_seconds` | 数字 | `600.0` | 调用期间无活动的超时秒数;`0` 表示不限时,不能为负数。YAML 中无效值会回退到默认值并记录警告。 |
545
+
546
+ **`allow_external_cwd` 的目录范围**:如果 iCode 会话由 ACP 客户端创建,且客户端提供了附加工作目录,那么即使 `allow_external_cwd` 为 `false`,外部智能体也可以在这些目录及其子目录中运行。
547
+
548
+ `command`、`args`、`env` 的值和 `cwd` 可以使用 `{{ENV_VAR}}` 引用 iCode 进程的环境变量。缺失或为空的变量会导致启动失败。连接测试、工作目录安全边界和配置项应用方式参阅[配置外部 ACP 智能体](../guides/extensions/external-acp-agents.md)。