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,276 @@
1
+ # Chat 选项
2
+
3
+ Chat 选项会给模型配置发出的每个请求加上额外字段。可以用它设置推理强度、开启或关闭思考、开启提示词缓存,或传入网关、自部署服务需要的参数。本指南先介绍填写方法,再列出常见模型服务的设置,并附上各服务的官方文档链接。
4
+
5
+ 提供商文档最后核对日期:**2026-09-30**。下面的示例供按需选用,不应全部一起开启。具体支持情况取决于模型、API 接口和服务端版本;兼容某种协议不代表支持完全相同的选项。
6
+
7
+ ## 添加 Chat 选项
8
+
9
+ 1. 打开“模型配置”窗口(参见[配置模型](./models.md#打开模型配置窗口)),选中一个模型配置。
10
+ 2. 在“其他选项”区域找到“Chat 选项(额外请求字段)”,点击“+ 添加”新增一行。
11
+ 3. 在左侧输入框填写字段名,在右侧输入框填写值。
12
+ 4. 点击“保存”。
13
+
14
+ 保存并关闭窗口后,修改对之后的请求生效。要删除某个选项,点击该行末尾的 ✕,然后保存。
15
+
16
+ ### 值的解析方式
17
+
18
+ iCode 会尽量把值当作 JSON 解析:
19
+
20
+ - `0.2` 作为数字发送,`true` 作为布尔值发送。
21
+ - `{"type": "adaptive"}` 作为对象发送,`["a", "b"]` 作为列表发送。
22
+ - 其他内容都作为文本发送:`high` 发送为 `"high"`。如果要发送看起来像数字或 `true` 的文本,请加上引号,例如 `"1"`。
23
+
24
+ 整个值必须写在一行内。请仔细核对括号、引号和逗号。对象中有错误(例如多了一个结尾逗号)时,会被当作普通文本保存,模型服务随后会拒绝请求。必须填写对象的字段(例如 `extra_body`)会先经过检查:iCode 会显示错误,不会保存。
25
+
26
+ ### 服务专有字段的位置
27
+
28
+ 所选提供商和 API 样式对应的客户端库只接受一组固定的顶层字段名,例如 `temperature`、Chat Completions 的 `reasoning_effort`,以及 Anthropic 的 `thinking`。未知字段可能在请求发出前就导致 `unexpected keyword argument` 错误。服务扩展字段,以及 iCode 内置客户端库尚未接受的新 API 字段,请放进 `extra_body`。OpenAI 兼容服务中的例子包括 `top_k`、`enable_thinking` 和 `chat_template_kwargs`:
29
+
30
+ | 字段名 | 值 |
31
+ | --- | --- |
32
+ | `extra_body` | `{"chat_template_kwargs": {"enable_thinking": false}, "top_k": 20}` |
33
+
34
+ 一个模型配置只能有一行 `extra_body`,所以请像上例一样,把所有此类字段写进同一个 JSON 对象。同一个字段既单独成行又出现在 `extra_body` 中时,实际发送的是 `extra_body` 中的值。
35
+
36
+ `extra_body` 会把字段合并到 HTTP 请求体中,但不能让服务端支持它原本不支持的参数。同样,`top_k` 对 OpenAI 兼容服务是扩展字段,对 Anthropic API 则是原生字段。
37
+
38
+ ### 有专门字段的设置
39
+
40
+ 以下设置不要写在 Chat 选项中:
41
+
42
+ - **输出长度**:使用“最大输出词元数”字段。保存时会拒绝 `max_tokens` 等行。
43
+ - **流式输出**:使用“流式输出”复选框,默认开启,取消勾选即可关闭。不要添加 `stream` 行。
44
+ - **模型**:使用“模型”字段。
45
+ - **HTTP 请求头**:使用“HTTP 附加请求头”各行,或者添加一行 `extra_headers`,值为 JSON 对象。对于 Anthropic 的 `anthropic-beta` 请求头,“HTTP 附加请求头”会添加到 iCode 的 Beta 标志之后,而 `extra_headers` 行会替换它们,详见 [Anthropic](#anthropic)。
46
+ - **Claude 思考设置**:使用配置文件中的 `thinking_block_binding` 和 `auto_interleaved_thinking` 两行,详见 [Claude 思考设置](./models.md#claude-思考设置)。
47
+
48
+ 消息、工具和系统提示词由 iCode 自行构建,因此保存时会拒绝 `messages` 等字段。
49
+
50
+ ### 不在配置中保存密钥
51
+
52
+ 要从环境变量读取值的一部分,用双大括号写上变量名。例如,把网关令牌作为请求头发送:
53
+
54
+ | 字段名 | 值 |
55
+ | --- | --- |
56
+ | `extra_headers` | `{"X-Api-Token": "{{MY_GATEWAY_TOKEN}}"}` |
57
+
58
+ 配置文件中保留的是占位符,iCode 在发送请求时才填入实际值。请在启动 iCode 之前设置好该变量;变量未设置时,iCode 会报错并指出变量名。
59
+
60
+ ### 哪些请求使用 Chat 选项
61
+
62
+ 使用同一模型配置的请求会共用 Chat 选项,包括主智能体、子智能体、工作流中的智能体、会话标题生成、自动审批的判断模型以及上下文压缩。具体操作可能根据自身请求覆盖或过滤部分选项。较高的推理强度也可能增加这些辅助请求的耗时和费用。
63
+
64
+ ## 提示词缓存
65
+
66
+ 在 iCode 默认的本地历史模式下,请求会重新发送当前上下文中的对话。提示词缓存让服务复用未变化的前缀,减少重复处理输入的工作量,通常也能降低输入费用。它与服务端保存对话是两回事。写入缓存可能有额外费用,能否节省费用取决于前缀的复用次数。
67
+
68
+ OpenAI、DeepSeek、GLM、Kimi 的 Chat Completions 接口和通义千问在支持的模型上提供自动缓存。vLLM 和 SGLang 的前缀缓存由服务端管理,是否生效取决于启动配置和模型支持情况。来源和例外见下文各提供商章节。
69
+
70
+ **Anthropic 的 Claude API 需要显式设置缓存。** 要自动缓存逐渐增长的对话前缀,请添加这一行:
71
+
72
+ | 字段名 | 值 |
73
+ | --- | --- |
74
+ | `extra_body` | `{"cache_control": {"type": "ephemeral"}}` |
75
+
76
+ 如果配置中已有 `extra_body` 行,请把 `"cache_control": {"type": "ephemeral"}` 加进它的对象中。Anthropic 标准的 5 分钟缓存写入费用为基础输入价格的 1.25 倍;读取费用为 0.1 倍或更低,因模型而异。如需保留 1 小时,使用 `{"type": "ephemeral", "ttl": "1h"}`,写入费用为 2 倍。有效期从写入或复用缓存的请求开始时计算,因此生成回答也会消耗其中一部分时间。此外,模型还有最短可缓存前缀的要求。当前限制和计费规则见 [Anthropic 提示词缓存文档](https://platform.claude.com/docs/en/build-with-claude/prompt-caching)。
77
+
78
+ ### “提示词缓存未开启”提醒
79
+
80
+ 保存模型配置时,如果提供商为“Anthropic”、模型 ID 包含 `claude`,且没有任何 `cache_control` 设置,iCode 会显示“提示词缓存未开启”窗口:
81
+
82
+ - **添加并保存**:把 `"cache_control": {"type": "ephemeral"}` 加入 `extra_body` 行(没有该行时自动新建),然后保存。
83
+ - **直接保存**:按原样保存配置。
84
+ - 按 **Esc** 或点击窗口外部:返回表单,不保存。
85
+
86
+ 当某次保存让该配置成为完整的 Claude 配置时(新建的配置,或改用“Anthropic”提供商、改成 Claude 模型的配置),iCode 会显示这个提醒。保存本来就是 Claude 配置的配置时,不会再次提醒。
87
+
88
+ 兼容 Anthropic 协议的服务有各自的缓存行为,可能接受、忽略或拒绝 `cache_control`,请查阅对应接口的文档。如果服务拒绝该字段,只从 `extra_body` 中删除 `"cache_control": {...}`,然后保存。此提醒只检查配置内容,无法判断服务端是否实际缓存了请求。
89
+
90
+ ### 检查缓存是否生效
91
+
92
+ 打开侧边栏(按 **Ctrl+G** 显示或隐藏),选择“上下文”标签页。在“词元用量”区域,“缓存命中”一行显示本会话累计报告的缓存读取量。只有请求报告命中时才会增长,不保证每次调用都增长。显示 `-` 不能证明缓存未开启:可能没有命中,也可能服务没有返回缓存用量。
93
+
94
+ 如果“缓存命中”一直显示 `-` 或不再增长:
95
+
96
+ - 检查模型配置是否包含该服务需要的设置(参见[常见模型服务的设置](#常见模型服务的设置))。
97
+ - 检查模型的最短可缓存前缀、有效期和缓存写入要求。短提示词可能不满足条件,已过期或被清理的条目也无法复用。
98
+ - 保持可复用内容稳定。更换模型、工具、推理设置或压缩历史都可能减少缓存复用,但发生变化不一定让此前所有匹配的前缀失效。
99
+ - 即使输入相同,请求被路由到不同后端时也可能无法命中。自动缓存不保证每次命中。
100
+
101
+ ## 常见模型服务的设置
102
+
103
+ 以下各节先给出推荐的提供商、API 样式和服务地址,再列出常用设置。字段名和取值范围会随模型变化,请以所用模型的官方文档为准。
104
+
105
+ ### OpenAI
106
+
107
+ 提供商选“OpenAI”,API 样式选“Responses”,服务地址使用默认值。“Chat Completions”也可以使用,但部分较新的模型只在 Responses 下支持工具调用。提示词缓存自动生效。
108
+
109
+ | 用途 | 字段名 | 值 |
110
+ | --- | --- | --- |
111
+ | 推理强度(Responses) | `reasoning` | `{"effort": "high"}` |
112
+ | 推理摘要(Responses) | `reasoning` | `{"effort": "high", "summary": "auto"}` |
113
+ | 推理强度(Chat Completions) | `reasoning_effort` | `high` |
114
+ | 回答更简短 | `verbosity` | `low` |
115
+ | 更便宜、处理更慢 | `service_tier` | `flex` |
116
+ | GPT-5.6 及之后模型的缓存有效期(Responses) | `extra_body` | `{"prompt_cache_options": {"mode": "implicit", "ttl": "30m"}}` |
117
+
118
+ 使用 Responses 时,请用 `reasoning`,不要用 `reasoning_effort`。iCode 会把 `verbosity` 选项转换为 API 的 `text.verbosity`。支持的推理强度、摘要、详细程度和 Flex 服务因模型而异。Flex 还可能返回资源不可用错误,参见 [Flex processing](https://developers.openai.com/api/docs/guides/flex-processing)。
119
+
120
+ GPT-5.6 及之后的模型使用 `prompt_cache_options`,有效期为 `30m`,自动缓存写入也会计费。较早的模型使用 `prompt_cache_retention`,取值可能为 `in_memory` 或 `24h`,取决于具体模型,两类设置不能混用。请保留 `implicit` 模式:`explicit` 模式需要在内容块上添加缓存断点,Chat 选项表单不会添加这些断点。
121
+
122
+ 使用 Responses 且地址为 OpenAI 官方地址时,iCode 还会把会话 ID 作为 `prompt_cache_key` 发送,同一会话的请求共用一个缓存键;子智能体和工作流中的智能体各用自己的键。要使用自定义的键,请添加 `prompt_cache_key` 行;不想发送,请将其值设为 `null`。
123
+
124
+ 除非需要服务端续接,否则请不要设置 `store`:iCode 默认发送 `false`,这仍然允许提示词缓存。设为 `true` 后,iCode 的上下文压缩会被禁用。
125
+
126
+ 官方文档:[Reasoning](https://developers.openai.com/api/docs/guides/reasoning)、[Prompt caching](https://developers.openai.com/api/docs/guides/prompt-caching)、[Responses API 参考](https://developers.openai.com/api/reference/resources/responses/methods/create)、[Chat Completions API 参考](https://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create)。
127
+
128
+ ### Anthropic
129
+
130
+ 提供商选“Anthropic”,服务地址为 `https://api.anthropic.com`,不要在末尾加 `/v1`。**请开启提示词缓存**,方法见[提示词缓存](#提示词缓存)。
131
+
132
+ | 用途 | 字段名 | 值 |
133
+ | --- | --- | --- |
134
+ | 提示词缓存 | `extra_body` | `{"cache_control": {"type": "ephemeral"}}` |
135
+ | 自适应思考 | `thinking` | `{"type": "adaptive"}` |
136
+ | 固定预算的思考(较早的模型) | `thinking` | `{"type": "enabled", "budget_tokens": 8000}` |
137
+ | 投入程度(effort) | `output_config` | `{"effort": "medium"}` |
138
+ | 其他地址上较早模型的交错思考 | `additional_beta_flags` | `["interleaved-thinking-2025-05-14"]` |
139
+
140
+ - 只有支持自适应思考的模型才能使用 `adaptive`;较新的模型会拒绝旧的 `enabled` / `budget_tokens` 形式。普通固定预算思考要求“最大输出词元数”大于 `budget_tokens`,手动交错思考的预算规则有所不同。
141
+ - 较新的 Claude 模型会拒绝非默认的 `temperature`、`top_p` 和 `top_k` 值,请不要设置。
142
+ - `additional_beta_flags` 和 `betas` 用于给请求增加 Beta 标志,“HTTP 附加请求头”中的 `anthropic-beta` 也一样。iCode 会把它们排在自己的标志之后,合并到同一个 `anthropic-beta` 请求头中发送。`extra_headers` 行中的 `anthropic-beta` 会替换所有这些标志,包括 iCode 自己的标志;此时 iCode 只补上思考设置所需的标志。
143
+ - 在 Anthropic 官方地址上使用固定预算的思考时,iCode 会自动添加交错思考的标志,详见 [Claude 思考设置](./models.md#claude-思考设置)。在其他地址上,请按上表自行添加。自适应思考已自动支持交错思考,无需该标志。交错思考的支持情况因模型而异,服务接受某个 Beta 标志并不代表它实际生效。
144
+ - 在 Anthropic 官方地址上,Claude Opus 5.5、Fable 5.1 或 Sonnet 5.5 使用自适应思考时,iCode 会请服务略去与对话对不上的早先思考内容,详见 [Claude 思考设置](./models.md#claude-思考设置)。你在 `thinking` 中自己写的 `block_binding` 会原样发送,iCode 会补上它所需的 Beta 标志。
145
+
146
+ 官方文档:[Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching)、[Adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking)、[Extended thinking](https://platform.claude.com/docs/en/build-with-claude/extended-thinking)、[Effort](https://platform.claude.com/docs/en/build-with-claude/effort)、[Beta headers](https://platform.claude.com/docs/en/api/beta-headers)。
147
+
148
+ ### DeepSeek
149
+
150
+ 提供商选“DeepSeek (OpenAI)”,API 样式选“Chat Completions”,服务地址使用默认的 `https://api.deepseek.com`。提示词缓存自动生效。
151
+
152
+ | 用途 | 字段名 | 值 |
153
+ | --- | --- | --- |
154
+ | 关闭思考 | `extra_body` | `{"thinking": {"type": "disabled"}}` |
155
+ | 推理强度 | `reasoning_effort` | `high` |
156
+
157
+ 当前 API 默认开启思考,推理强度支持 `low`、`high` 和 `max`。在思考模式下,`temperature`、`presence_penalty` 和 `frequency_penalty` 会被忽略;`top_p` 仅在 0.95 到 1.0 范围内生效。较早模型 ID 的能力可能不同。
158
+
159
+ 官方文档:[思考模式](https://api-docs.deepseek.com/guides/thinking_mode)、[上下文硬盘缓存](https://api-docs.deepseek.com/guides/kv_cache)、[API 参考](https://api-docs.deepseek.com/api/create-chat-completion)。
160
+
161
+ ### GLM(智谱 / Z.ai)
162
+
163
+ 提供商选“GLM (OpenAI)”。默认服务地址为 `https://open.bigmodel.cn/api/paas/v4`;在中国大陆以外请使用 `https://api.z.ai/api/paas/v4`;使用 GLM Coding Plan 时,请使用 `https://open.bigmodel.cn/api/coding/paas/v4` 或 `https://api.z.ai/api/coding/paas/v4`。提示词缓存自动生效。
164
+
165
+ | 用途 | 字段名 | 值 |
166
+ | --- | --- | --- |
167
+ | 关闭思考 | `extra_body` | `{"thinking": {"type": "disabled"}}` |
168
+ | 在上下文中保留之前的推理 | `extra_body` | `{"thinking": {"type": "enabled", "clear_thinking": false}}` |
169
+ | 推理强度(GLM-5.2 及之后) | `reasoning_effort` | `high` |
170
+
171
+ GLM-5.3 始终思考,推理强度支持 `low`、`high` 和 `max`,不要给它传入 `thinking.type: disabled`。GLM-5.2 的强度映射不同,更早的模型不支持该强度字段。`clear_thinking: false` 还要求完整保留历史推理,iCode 的 GLM 提供商会保留这些内容。`temperature` 的取值范围为 0 到 1。
172
+
173
+ 官方文档:[Thinking mode](https://docs.z.ai/guides/capabilities/thinking-mode)、[Context caching](https://docs.z.ai/guides/capabilities/cache)、[API 参考](https://docs.z.ai/api-reference/llm/chat-completion)。
174
+
175
+ ### Kimi(月之暗面)
176
+
177
+ 提供商选“OpenAI”,API 样式选“Chat Completions”,服务地址为 `https://api.moonshot.cn/v1`(中国大陆以外为 `https://api.moonshot.ai/v1`)。提示词缓存自动生效。
178
+
179
+ | 用途 | 字段名 | 值 |
180
+ | --- | --- | --- |
181
+ | 推理强度(Kimi K3) | `reasoning_effort` | `high` |
182
+ | 关闭思考(Kimi K2.6) | `extra_body` | `{"thinking": {"type": "disabled"}}` |
183
+ | 延长缓存有效期(Chat Completions) | `extra_body` | `{"prompt_cache_options": {"mode": "implicit", "ttl": "1h"}}` |
184
+
185
+ Kimi K3 始终思考,强度支持 `low`、`high` 和 `max`,不接受 `thinking` 字段。K2.7 Code 始终思考,但不支持 `reasoning_effort`;K2.6 可以关闭思考,也不支持该强度字段。除非具体模型的文档明确支持,否则请不要设置采样选项;部分 Kimi 模型的固定值限制不代表整个系列都采用相同的采样规则。iCode 只接受省略 `n` 或将其设为 `1`。
186
+
187
+ Chat Completions 默认使用 5 分钟缓存。1 小时选项的写入价格更高;已有缓存条目过期前,修改 TTL 不会改变其有效期。
188
+
189
+ Kimi 也提供兼容 Anthropic 协议的接口:提供商选“Anthropic”,服务地址为 `https://api.moonshot.ai/anthropic`。在该接口上,只有请求中要求缓存时才会写入缓存,因此请添加[提示词缓存](#提示词缓存)中的 `cache_control` 设置。
190
+
191
+ 官方文档:[Chat API](https://platform.kimi.ai/docs/api/chat)、[使用思考模型](https://platform.kimi.ai/docs/guide/use-thinking-models)、[上下文缓存](https://platform.kimi.ai/docs/guide/context-caching)、[Anthropic 兼容 API](https://platform.kimi.ai/docs/api/messages)。
192
+
193
+ ### 通义千问(阿里云百炼)
194
+
195
+ 提供商选“OpenAI”,API 样式选“Chat Completions”,服务地址使用百炼控制台中的 OpenAI 兼容地址。目前推荐工作空间专属接口,例如 `https://<WorkspaceId>.cn-beijing.maas.aliyuncs.com/compatible-mode/v1`(北京)或 `https://<WorkspaceId>.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1`(新加坡),请将 `<WorkspaceId>` 替换为实际工作空间 ID。旧的 `dashscope.aliyuncs.com` 和 `dashscope-intl.aliyuncs.com` 接口仍可使用。API 密钥与接口地域必须匹配,其他地域和 Coding Plan 使用各自的接口。在支持的模型上,隐式缓存自动开启,但不保证命中。
196
+
197
+ | 用途 | 字段名 | 值 |
198
+ | --- | --- | --- |
199
+ | 关闭思考 | `extra_body` | `{"enable_thinking": false}` |
200
+ | 限定思考预算 | `extra_body` | `{"enable_thinking": true, "thinking_budget": 4096}` |
201
+ | 采样 | `extra_body` | `{"top_k": 20}` |
202
+ | 允许模型联网搜索 | `extra_body` | `{"enable_search": true}` |
203
+
204
+ `enable_thinking: false` 适用于混合思考模型,纯思考模型无法关闭思考。预算范围、`top_k` 和 `enable_search` 的支持情况也因模型而异。部分开源千问模型的思考模式要求开启“流式输出”,商业模型则可能同时支持非流式请求。百炼还提供通过消息内容块标记启用的显式缓存,Chat 选项表单不会添加这些标记。
205
+
206
+ 官方文档:[OpenAI 兼容](https://www.alibabacloud.com/help/en/model-studio/compatibility-of-openai-with-dashscope)、[深度思考](https://www.alibabacloud.com/help/en/model-studio/deep-thinking)、[上下文缓存](https://www.alibabacloud.com/help/en/model-studio/context-cache)。
207
+
208
+ ### vLLM
209
+
210
+ 提供商选“OpenAI”,API 样式选“Chat Completions”,服务地址为 `http://<主机>:<端口>/v1`。“API 密钥”填写服务端 `--api-key` 的值;服务端未设置密钥时留空。前缀缓存由服务端配置,请检查 `--enable-prefix-caching` / `--no-enable-prefix-caching` 以及所部署模型的支持情况。
211
+
212
+ 对于需要使用工具的 iCode 智能体,启动服务时请加上 `--enable-auto-tool-choice` 和与模型匹配的 `--tool-call-parser`。推理模型还应配置匹配的 `--reasoning-parser`,以分开显示推理过程和回答。
213
+
214
+ | 用途 | 字段名 | 值 |
215
+ | --- | --- | --- |
216
+ | 关闭思考(Qwen3 等) | `extra_body` | `{"chat_template_kwargs": {"enable_thinking": false}}` |
217
+ | 推理强度 | `reasoning_effort` | `low` |
218
+ | 采样 | `extra_body` | `{"top_k": 20, "min_p": 0.0, "repetition_penalty": 1.05}` |
219
+
220
+ 这些参数取决于模型模板,不是通用开关。有些模型始终思考,有些使用不同的开关。`reasoning_effort` 也不是在每个模型上都提供相同的强度等级。请使用与所安装 vLLM 版本对应的文档。
221
+
222
+ 官方文档:[Tool calling](https://docs.vllm.ai/en/latest/features/tool_calling/)、[Reasoning outputs](https://docs.vllm.ai/en/latest/features/reasoning_outputs/)、[OpenAI-compatible server](https://docs.vllm.ai/en/latest/serving/openai_compatible_server/)、[Server arguments](https://docs.vllm.ai/en/latest/cli/serve/)。
223
+
224
+ ### SGLang
225
+
226
+ 提供商选“OpenAI”,API 样式选“Chat Completions”,服务地址为 `http://<主机>:<端口>/v1`。使用工具时配置工具解析器,使用推理模型时配置推理解析器。普通服务配置默认开启前缀缓存,但 `--disable-radix-cache` 或模型自身的限制可能将其禁用。
227
+
228
+ | 用途 | 字段名 | 值 |
229
+ | --- | --- | --- |
230
+ | 关闭思考(混合思考的 Qwen3 模型) | `extra_body` | `{"chat_template_kwargs": {"enable_thinking": false}}` |
231
+ | 开启思考(DeepSeek-V3.1) | `extra_body` | `{"chat_template_kwargs": {"thinking": true}}` |
232
+ | 推理强度 | `reasoning_effort` | `low` |
233
+ | 采样 | `extra_body` | `{"top_k": 20, "min_p": 0.0, "repetition_penalty": 1.05}` |
234
+
235
+ 模板接受的字段和强度等级取决于模型和 SGLang 版本。推理解析器负责分离输出,本身不会开启思考。保持 `separate_reasoning` 开启,才能分开显示推理过程。`reasoning_effort` 应在请求或服务端模板默认值中择一设置,不要两处同时设置。
236
+
237
+ 官方文档:[OpenAI-compatible API](https://docs.sglang.io/docs/basic_usage/openai_api_completions)、[Server arguments](https://docs.sglang.io/docs/advanced_features/server_arguments)、[Tool parser](https://docs.sglang.io/docs/advanced_features/tool_parser)、[Reasoning parser](https://docs.sglang.io/docs/advanced_features/separate_reasoning)。
238
+
239
+ ### LiteLLM 代理
240
+
241
+ 提供商选“OpenAI”,API 样式选“Chat Completions”,服务地址为 `http://<主机>:4000`,API 密钥填写 LiteLLM 虚拟密钥(`sk-...`)。使用 Claude 模型时,也可以选择提供商“Anthropic”并使用相同的服务地址,这样会连接到 LiteLLM 的 Anthropic 格式接口。
242
+
243
+ | 用途 | 字段名 | 值 |
244
+ | --- | --- | --- |
245
+ | 为费用统计打标签 | `extra_body` | `{"metadata": {"tags": ["team-a"]}}` |
246
+ | 按标签路由 | `extra_body` | `{"tags": ["free"]}` |
247
+
248
+ 标签路由要求代理配置中已有匹配的部署标签,并开启标签过滤;只在请求中传入标签不会自动配置路由。费用报表还取决于代理的统计配置和可用功能。
249
+
250
+ 对于不支持的 OpenAI 参数,代理管理员可以配置 `drop_params`,这些设置随后会被静默省略。它不能通用地修复无效的提供商扩展字段或参数值,此类问题应在模型配置中删除或修正对应字段。
251
+
252
+ 官方文档:[Virtual keys](https://docs.litellm.ai/docs/proxy/user_keys)、[Cost tracking](https://docs.litellm.ai/docs/proxy/cost_tracking)、[Tag routing](https://docs.litellm.ai/docs/proxy/tag_routing)、[Drop unsupported params](https://docs.litellm.ai/docs/completion/drop_params)、[Anthropic `/v1/messages` 接口](https://docs.litellm.ai/docs/anthropic_unified)。
253
+
254
+ ### OpenRouter
255
+
256
+ 提供商选“OpenAI”,API 样式选“Chat Completions”,服务地址为 `https://openrouter.ai/api/v1`。
257
+
258
+ | 用途 | 字段名 | 值 |
259
+ | --- | --- | --- |
260
+ | 指定由哪些提供商提供模型 | `extra_body` | `{"provider": {"order": ["anthropic"], "allow_fallbacks": false}}` |
261
+ | 推理强度 | `extra_body` | `{"reasoning": {"effort": "high"}}` |
262
+ | Claude 模型的提示词缓存 | `extra_body` | `{"cache_control": {"type": "ephemeral"}}` |
263
+
264
+ 需要同时使用时,请写进同一个对象,例如 `{"provider": {"order": ["anthropic"]}, "cache_control": {"type": "ephemeral"}}`。
265
+
266
+ `provider.order` 设置优先顺序;如果只允许所列提供商处理请求,请保留 `allow_fallbacks: false`。顶层 `cache_control` 可用于 Claude 的自动缓存,但仍需模型和提供商支持。OpenRouter 文档规定的行为可能与直接调用提供商不同。
267
+
268
+ 官方文档:[Quickstart](https://openrouter.ai/docs/quickstart)、[Provider selection](https://openrouter.ai/docs/guides/routing/provider-selection)、[Reasoning tokens](https://openrouter.ai/docs/guides/best-practices/reasoning-tokens)、[Prompt caching](https://openrouter.ai/docs/guides/best-practices/prompt-caching)。
269
+
270
+ ## 添加选项后请求失败时
271
+
272
+ - **保存时提示“Chat 选项第 N 行:……”**:按提示修改对应的行,然后重新保存。
273
+ - **报错中包含 `unexpected keyword argument 'x'`**:把字段 `x` 移入 `extra_body`,方法见[服务专有字段的位置](#服务专有字段的位置)。
274
+ - **模型服务提示不支持某个字段**:只删除该字段。如果它位于 `extra_body` 中,只从 JSON 对象里删除这一项,保留其他项,然后保存。
275
+ - **报错中提到某个环境变量**:设置该变量后重启 iCode,或者删除对应的 `{{...}}` 占位符。
276
+ - **找不到明显原因**:逐个删除最近添加的行,直到请求恢复正常,并查阅所用模型的官方文档。
@@ -0,0 +1,42 @@
1
+ # 配置上下文压缩
2
+
3
+ 长对话接近模型的上下文窗口时,iCode 会自动压缩较早的内容,为后续请求留出空间。本指南介绍如何配置“内置”类型智能体的 Last Words 补充内容和输出上限。外部 ACP 智能体自行管理上下文。
4
+
5
+ 新建智能体已采用适合大多数任务的默认设置,通常无需调整。
6
+
7
+ ## 了解压缩何时发生
8
+
9
+ iCode 根据当前模型配置中的最大上下文窗口、最大输出词元数和安全余量自动计算何时开始压缩。请根据模型能力和任务需要,在[模型配置](./models.md)中设置最大上下文窗口和最大输出词元数。“压缩”标签页不能单独设置触发时机。
10
+
11
+ 上下文接近占满时,iCode 还会降低下一次请求的输出上限,使输入和输出都能容纳在上下文窗口内,并为词元数估算误差留出少量余量。
12
+
13
+ 模型服务仍可能报告上下文窗口已满,例如模型实际的上下文窗口小于模型配置中设置的值。如果服务的报错给出的上限小于模型配置中的最大上下文窗口,这次请求会直接失败,报错信息会给出这个上限,请把模型配置中的最大上下文窗口改为该值或更小。否则 iCode 会压缩上下文,并自动重新发送一次请求;如果服务再次报告上下文窗口已满,这次请求就会失败。模型因没有空间回复、一个字都没写就停止时,请求也可能失败。失败之后,下一次请求会先压缩上下文,尽量腾出空间,例如点击“重试”、发送下一条消息或重试工作流节点时。如果仍反复出现,请在模型配置中把最大上下文窗口改为模型的实际值。
14
+
15
+ 压缩时,iCode 会先将较早的工具结果替换为摘要,必要时再移除较早的工具调用及其结果;如果仍需释放空间,则在当前上下文中用压缩摘要代替已经完成的对话轮次。如果这些处理仍然不够,iCode 会为当前任务生成 Last Words,保留继续完成任务所需的信息,再从提供给模型的上下文中移除本轮的工具调用、工具结果和中间内容,只保留用户消息。
16
+
17
+ 三种处理的作用不同:精简较早的工具调用和结果只减少工具使用的占用;压缩摘要代替已完成轮次;Last Words 用于续接当前尚未完成的任务。
18
+
19
+ 在 TUI 中可以观察到以下变化:
20
+
21
+ - 压缩期间显示“正在压缩对话”。
22
+ - 压缩完成后,侧边栏消息列表中已压缩的对话轮次以灰色显示;对话区在相应位置显示灰色的“已压缩”标记和压缩摘要。
23
+ - 如果生成了 Last Words,可以展开已完成的压缩卡片查看 Last Words 内容。
24
+
25
+ 已压缩的历史轮次仍会保留在会话中。智能体可在需要时查询其中的具体信息,但不会将整段对话重新加入当前上下文。
26
+
27
+ 压缩能降低上下文占用,但摘要无法保证保留每个原始细节。需要长期保留且不能遗漏的项目规则应写入[记忆文件](./memory.md),重要工作结果应写入工作目录文件,而不应只存在于对话中。
28
+
29
+ ## 调整压缩设置
30
+
31
+ 1. 在输入栏输入 `/agents compaction`,打开当前智能体的“压缩”标签页。如需修改其他智能体,在左侧列表中选择。
32
+ 2. 按需调整“Last Words 最大输出词元数”,填写界面允许范围内的整数。实际生成上限不会超过当前模型配置的最大输出词元数。
33
+ 3. 如需让 Last Words 重点保留某类信息,填写“Last Words 补充内容(可选强调)”。
34
+ 4. 点击“保存”。新设置会在该智能体后续需要压缩时生效。
35
+
36
+ “Last Words 补充内容(可选强调)”用于指出 Last Words 需要重点保留的信息。例如,如果经常使用该智能体排查问题,可填写:
37
+
38
+ ```text
39
+ 优先保留复现步骤、已经排除的原因、关键日志和仍待验证的假设。
40
+ ```
41
+
42
+ 填写时聚焦于继续任务所需、但容易在压缩中遗漏的信息,并尽量简短。
@@ -0,0 +1,48 @@
1
+ # 配置记忆
2
+
3
+ 本指南介绍如何为主智能体配置记忆。
4
+
5
+ ## 准备记忆内容
6
+
7
+ **记忆会在主智能体加载时加入系统提示词。** iCode 会读取当前主智能体配置的记忆文件,并将内容作为参考资料提供给智能体。记忆内容会占用模型的上下文窗口,并随请求发送给模型服务。因此,建议避免在记忆中包含密钥、访问令牌等敏感信息。
8
+
9
+ **子智能体不加载记忆。** 子智能体不会继承主智能体已加载的记忆,也不会加载自身智能体配置中的记忆。[工作流](../running/workflows.md)中的智能体节点则会加载其智能体配置中的记忆。
10
+
11
+ **记忆适合保存稳定且通用的信息。** iCode 只加载扩展名为 `.md` 或 `.txt` 的记忆文件。适合放入记忆的内容应当能够在多个任务中重复使用,例如项目约定、背景资料和常用信息。内容应简短、明确并保持更新;临时任务要求更适合直接写在当前请求中。
12
+
13
+ **默认智能体已配置 AGENTS.md 作为记忆。** iCode 默认提供的主智能体(如 Code Agent)会加载工作目录中的 `AGENTS.md`。需要为项目补充通用说明时,可以优先维护该文件;如不需要,可在“记忆”标签页中删除该条目。
14
+
15
+ ## 添加记忆文件
16
+
17
+ 1. 在输入栏中输入 `/agents memory`,打开当前智能体的“记忆”标签页。如需配置其他主智能体,在左侧列表中选择。
18
+ 2. 在“文件”区域点击“+ 添加文件”。
19
+ 3. 输入路径,或通过“浏览”按钮选择 `.md` 或 `.txt` 文件。勾选“工作区相对路径”时填写相对路径(例如 `AGENTS.md`、`docs/context.md`),否则填写绝对路径。
20
+
21
+ > **注意**:相对路径在加载记忆时按当前工作目录解析,而不是按照创建智能体配置时的目录解析。因此,同一个智能体可以在不同项目中加载各自的 `AGENTS.md`。相对路径不能指向工作目录以外的位置;如需加载工作目录以外的文件,请使用绝对路径。
22
+ 4. 点击“保存”,然后关闭智能体配置窗口。
23
+
24
+ ## 添加记忆文件夹
25
+
26
+ 需要加载一组参考文件时,在“文件夹”区域点击“+ 添加文件夹”,勾选“工作区相对路径”时填写相对路径,否则填写绝对路径。添加完成后点击“保存”,然后关闭智能体配置窗口。
27
+
28
+ iCode 会先加载该目录直属的 `.md` 和 `.txt` 文件,再逐层扫描子目录。对于每个配置的文件夹,最多扫描两层子目录,最多加载 100 个文件。若某个重要文件可能不在扫描范围内,可将其单独添加到“文件”区域。
29
+
30
+ ## 记忆的加载与重新加载
31
+
32
+ 同一实际文件同时被单独添加和从文件夹中发现时,只会加载一次。多个记忆来源的合计内容上限为 35,000 词元。iCode 先加载单独添加的文件,再加载文件夹;一旦某个文件会使内容超过上限,该文件及其后的所有文件都会被跳过,iCode 会显示警告。
33
+
34
+ 切换工作目录或修改当前智能体配置后,iCode 会根据新路径重新加载记忆。
35
+
36
+ iCode 不会实时监控已经加载的记忆文件。直接在磁盘上修改文件内容后,需要重新加载主智能体才能使修改生效,例如重新启动 iCode、切换工作目录、修改并保存当前智能体配置,或切换到其他主智能体后再切回。
37
+
38
+ ## 验证记忆是否加载
39
+
40
+ 在输入栏中输入 `/runtime`,或点击输入栏上方状态栏右端显示的文件数量,打开“运行时详情”窗口,切换到“文件”标签页。页面会按配置来源列出实际加载的文件。预期文件出现在列表中,即表示记忆已加载。
41
+
42
+ 如果预期文件未显示,请检查:
43
+
44
+ * 路径是否存在,文件扩展名是否为 `.md` 或 `.txt`。
45
+ * 相对路径指向的文件是否位于当前工作目录内。
46
+ * 添加的条目类型与实际路径是否匹配(文件条目应指向文件,文件夹条目应指向文件夹)。
47
+ * 是否出现内容超过 35,000 词元或部分文件被跳过的警告。
48
+ * 修改配置后是否点击了“保存”。
@@ -0,0 +1,158 @@
1
+ # 配置模型
2
+
3
+ 模型配置包含连接模型服务所需的信息。本指南介绍如何在终端用户界面(Terminal User Interface,TUI)中创建、克隆、修改、切换和删除模型配置。配置保存后,可以在不同任务之间切换,不必重复填写连接参数。
4
+
5
+ ## 打开模型配置窗口
6
+
7
+ 使用以下任一方式打开“模型配置”窗口:
8
+
9
+ - 按 **F4**。
10
+ - 点击界面底部的 `f4 模型`。
11
+ - 在输入栏中输入 `/models`。
12
+
13
+ 左侧列表显示已有模型配置,右侧表单显示当前选中配置的内容。
14
+
15
+ 任务运行期间,“模型配置”窗口将以只读模式打开,无法新建、修改或删除配置。请等待任务结束后再进行配置调整。
16
+
17
+ ## 管理模型配置
18
+
19
+ ### 创建模型配置
20
+
21
+ 1. 点击“新建”。
22
+ 2. 填写自定义的配置名称,例如 `我的模型`。
23
+ 3. 在模型选项区域,选择模型提供商和 API 样式。仅 OpenAI 和 DeepSeek(OpenAI)提供 API 样式选项。配置前,请根据模型服务商的文档确认其支持的 API,并按文档建议选择 `Chat Completions` 或 `Responses`。如果服务商仅支持其中一种 API,请选择对应的 API 样式;如果两种 API 均支持,则根据服务商的建议或实际使用需求选择。
24
+ 4. 填写模型 ID,并根据模型服务的要求填写服务地址和 API 密钥。
25
+ 5. 根据模型提供商的说明,填写最大上下文窗口和最大输出词元数。
26
+ 6. 根据需要调整流式输出、视觉模型和连接选项。新建的配置默认开启流式输出。
27
+ 7. 点击“保存”。
28
+
29
+ **注意事项:**
30
+
31
+ - 点击“新建”时,iCode 会立即创建并保存一项空白配置。后续填写或修改的内容需要点击“保存”才会生效;直接关闭窗口不会删除已经创建的空白配置。
32
+ - 配置名称用于在界面中展示和区分模型配置,不会发送给模型服务。配置名称不能为空,且不能与已有配置重复(不区分大小写)。可以使用中文、空格、字母、数字和常见符号。
33
+ - 模型 ID 和词元限制等必填信息不完整时,该配置不会出现在可选模型列表中。
34
+ - 开启流式输出后,回复会随模型生成逐步显示。只要模型服务持续发送内容,较长的回复可以超过“HTTP 读取超时(秒)”设定的时长;只有服务停止发送达到该时长时才会超时。在旧版 iCode 中保存时未勾选“流式输出”的配置,现在也会使用流式输出;如需关闭,请取消勾选“流式输出”后再次保存。如果换回旧版 iCode,旧版会把本版本开启流式输出后保存的配置当作未开启。
35
+ - 开启视觉模型后,图片会以 PNG、JPEG、GIF 或 WebP 格式发送给模型。工具返回的其他格式图片会改为发送一条“图片已略去”的简短说明,对话可以继续。
36
+ - 若此前没有可用的模型配置,新配置在保存并关闭窗口后将自动成为当前使用的模型配置。已有其他模型配置正在使用时,保存新配置不会自动切换模型。
37
+ - 如需设置推理强度、提示词缓存或其他请求字段,请使用“其他选项”区域中的“Chat 选项(额外请求字段)”。参见 [Chat 选项](./chat-options.md),其中还列出了常见模型服务的设置。某次保存让配置成为通过 Anthropic 协议使用的 Claude 配置时,如果缺少缓存设置,iCode 会提示添加。
38
+
39
+ ### 通过环境变量提供 API 密钥
40
+
41
+ 直接填写的 API 密钥会随模型配置文件保存在本机。
42
+
43
+ 若要从环境变量读取密钥,在 API 密钥字段中填写:
44
+
45
+ ```text
46
+ {{PROVIDER_API_KEY}}
47
+ ```
48
+
49
+ 将 `PROVIDER_API_KEY` 替换为存放密钥的环境变量名;启动 iCode 前应确保该环境变量已经设置。环境变量名只能包含字母、数字和下划线,且不能以数字开头。
50
+
51
+ ### 克隆模型配置
52
+
53
+ 需要创建一套大部分参数相同的配置时,可以克隆现有配置。例如,同一提供商下使用不同模型 ID,或为相同模型设置不同的上下文和输出限制。
54
+
55
+ 1. 在左侧列表中选择要复制的模型配置。
56
+ 2. 点击“克隆”。
57
+ 3. iCode 会创建并选中一个包含原配置全部字段的副本,并为副本生成不重复的名称。
58
+ 4. 修改配置名称以及需要变更的字段。
59
+ 5. 点击“保存”。
60
+
61
+ 克隆操作会在点击“克隆”时立即保存副本,但不会将副本切换为当前使用的模型。
62
+
63
+ ### 修改模型配置
64
+
65
+ 1. 在左侧列表中选择模型配置。
66
+ 2. 修改需要调整的字段。
67
+ 3. 点击“保存”。
68
+
69
+ 如果修改了正在使用的模型配置,保存并关闭配置窗口后,新配置将用于后续请求。
70
+
71
+ ### Claude 思考设置
72
+
73
+ Claude Opus 5.5、Fable 5.1 和 Sonnet 5.5 会把返回的思考内容与它之前的对话绑定。之前的对话发生变化后(例如 iCode 压缩了上下文),模型服务可能拒绝读回这些思考内容。当这些模型在 Anthropic 官方地址上使用自适应思考(在 [“Chat 选项”](./chat-options.md#anthropic)中设置 `"thinking": {"type": "adaptive"}`)时,iCode 会请服务略去对不上的思考内容,而不是拒绝请求。这样模型看到的早先推理会变少,但请求可以正常完成。对于服务原本不做这项检查的账号,这项要求也会让服务开始检查,对不上的思考内容同样会被略去。
74
+
75
+ 如需更改,请在 iCode 配置目录的 `models` 文件夹中(macOS 和 Linux 为 `~/.chrys/models/`,Windows 为 `%APPDATA%\chrys\models\`;文件中的 `name:` 一行即配置名称)打开该配置的文件,添加一行 `thinking_block_binding`,取下列值之一,然后重启 iCode:
76
+
77
+ | 值 | iCode 向服务提出的要求 |
78
+ | --- | --- |
79
+ | `auto`(默认) | 如上所述。 |
80
+ | `drop_block` | 略去对不上的思考内容。适用于任何地址和模型,只要思考为自适应或固定预算。 |
81
+ | `error` | 遇到对不上的思考内容时拒绝请求。适用于任何地址和模型,只要思考为自适应或固定预算。 |
82
+ | `off` | 不提出要求。你在“Chat 选项”的 `thinking` 中自己写的 `block_binding` 仍会原样发送。 |
83
+
84
+ 如果服务仍因对不上的思考内容拒绝了请求,iCode 会去掉读回的早先思考内容,再发送一次请求,之后也不再发送这些思考内容。这会多发一次请求,模型也不再看到那部分早先的推理。设为 `error` 时,iCode 会直接报告这次拒绝。
85
+
86
+ 在 Anthropic 官方地址上使用固定预算的思考(`"type": "enabled"`)时,iCode 还会开启工具调用之间的思考。Claude Haiku 4.5 和 Claude Opus 4.6 在这种模式下不支持,因此不会开启。如需关闭,请添加一行 `auto_interleaved_thinking: false`。
87
+
88
+ 之后在“模型配置”窗口中保存该配置时,这些行会保留。
89
+
90
+ ### 删除模型配置
91
+
92
+ 删除操作会移除保存在本机的模型配置文件,且**无法在 iCode 中撤销**。确认不再需要该配置后:
93
+
94
+ 1. 打开“模型配置”窗口。
95
+ 2. 在左侧列表中选择要删除的配置。
96
+ 3. 点击“删除”。
97
+ 4. 在确认窗口中再次核对要删除的配置名称,然后点击“删除”。
98
+
99
+ iCode 至少保留一项模型配置,因此只剩一项时无法点击“删除”。如果删除了正在使用的配置,关闭配置窗口后,iCode 会自动切换到其他可选配置。
100
+
101
+ ## 切换和验证模型配置
102
+
103
+ ### 切换当前模型配置
104
+
105
+ 可以点击模型配置名称标签,或在输入栏中快速切换模型配置。
106
+
107
+ 点击模型配置名称标签:
108
+
109
+ 1. 点击输入栏上方状态栏中的模型配置名称,打开模型选择窗口。
110
+ 2. 通过鼠标点击,或使用上下方向键选择模型配置后按回车确认。
111
+
112
+ 在输入栏中快速切换:
113
+
114
+ 1. 在输入栏中输入 `$`,模型配置列表会显示在输入栏上方。
115
+ 2. 继续输入配置名称以筛选结果。
116
+ 3. 使用上下方向键选择模型配置,然后按回车确认。
117
+
118
+ 切换后,状态栏会显示新的模型配置名称。当前使用的配置在列表中以灰色显示,名称前带有空心圆圈。缺少必填项的模型配置不会显示在列表中。
119
+
120
+ 当前对话会在新的模型配置下继续。有些模型服务返回的推理内容只有它自己能读取,例如 Claude 的思考内容和 OpenAI 的加密推理。如果新配置把请求发往另一个服务地址,iCode 会在请求中略去这些早先的推理内容。你的消息、模型的回复以及 iCode 运行的工具结果仍会照常发送;同一步中由模型服务自己运行的工具,其结果也可能被略去。切换回使用原地址的配置后,这些推理内容会重新发送。早期 iCode 版本保存的推理内容仍按原来的方式发送。
121
+
122
+ 如果状态栏中的模型配置名称灰度显示,表示当前智能体已绑定特定模型配置,点击它只会提示绑定情况。此时输入 `$` 也不会显示模型配置列表,需要先[修改该智能体的模型设置](./agents.md#设置智能体使用的模型),才能切换模型配置。智能体正在运行时也不能切换。
123
+
124
+ ### 验证模型配置
125
+
126
+ 切换模型后,在输入栏中提交:
127
+
128
+ ```text
129
+ 你好
130
+ ```
131
+
132
+ iCode 应正常返回问候回复。若模型服务返回错误,先核对模型 ID、服务地址、API 密钥等模型配置。
133
+
134
+ 仍报错时,对照以下现象排查:
135
+
136
+ - **报错信息包含 `The Chat Completions client supports only n=1`**:使用 Chat Completions 样式时,iCode 每次请求只处理一条回复,不支持多候选回复,`n` 参数应省略或设为整数 `1`。在模型配置的[“Chat 选项(额外请求字段)”](./chat-options.md)中把该值删除或改为 `1`,包括经 `extra_body` 间接设置的情况。
137
+ - **返回状态为 `HTTP 200` 但响应不是有效的模型回复**:例如 Content-Type 为 `text/html`,正文是错误页、错误 JSON 或空内容。出现这种情况说明网关或代理把后端错误包装成了成功响应;此时核对所选 API 样式与模型服务地址是否匹配,并检查代理路由。
138
+ - **模型服务的内容过滤拦截了回复**:iCode 不会重试该请求,也不会执行被过滤或被拒绝的回复中请求的工具。请换一种方式描述需求。
139
+ - **使用 Responses 样式时,模型服务报告回复失败**:iCode 会显示服务给出的错误。只有再次尝试可能成功的错误(例如服务器错误或限流)才会重试;服务拒绝的请求(例如含有无法读取的图片,或超出账户额度)不会重试。流式回复在完成前中断时,也按同样的规则重试。超出上下文窗口的请求例外,参见[无法连接模型服务时](#无法连接模型服务时)。如果服务在这次失败的回复中已经执行过可能产生改动的工具(例如 MCP 调用),iCode 不会重试,以免工具重复执行。如果服务始终不说明流式回复是否已完成,iCode 会保留已收到的内容,并在日志中记录一条警告。
140
+ - **使用 Anthropic 协议时,流式回复在完成前中断**:iCode 会重试该请求,且不会执行中断的回复中请求的工具。与 Responses 样式一样,如果服务已经执行过可能产生改动的工具(例如 MCP 调用),iCode 不会重试,以免工具重复执行。
141
+ - **流式回复有时中途停止,但没有报错**:部分使用 Chat Completions 样式的服务在结束流式输出时不说明回复是否已完成,iCode 会保留这样的回复。如果希望 iCode 把它当作中断的回复并重试,请在 iCode 配置目录的 `models` 文件夹中(macOS 和 Linux 为 `~/.chrys/models/`,Windows 为 `%APPDATA%\chrys\models\`;文件中的 `name:` 一行即配置名称)打开该配置的文件,添加一行 `stream_requires_finish_reason: true`,然后重启 iCode。之后在“模型配置”窗口中保存该配置时,这一行会保留。
142
+ - **开启流式输出后请求失败,且模型服务或网关不支持流式输出**:在模型配置中取消勾选“流式输出”并保存。如果直接修改配置文件,请添加一行 `stream: false`,然后重启 iCode。关闭流式输出只能解决服务不支持流式输出导致的问题。
143
+
144
+ ### 无法连接模型服务时
145
+
146
+ iCode 能判断模型请求失败的原因时,会用通俗的话说明原因,并在下方附上原始错误信息;暂停的子智能体卡片上也是如此。iCode 自动重试时,重试提示只显示这句说明。如果运行 iCode 的设备看起来没有网络连接,iCode 也会一并提示,此时请先检查网络。
147
+
148
+ | 提示内容 | 检查什么 |
149
+ | --- | --- |
150
+ | 无法解析服务地址 | 网络连接和 DNS 设置。如果地址填错了,在模型配置中修改服务地址。 |
151
+ | 拒绝了连接 | 服务地址中的地址和端口,以及模型服务是否正在运行。 |
152
+ | 连接超时或等待响应超时 | 网络、防火墙或 VPN。 |
153
+ | 无法连接到代理 | 代理软件是否正在运行、代理设置是否正确。如需不经代理直接连接,在模型配置中开启“绕过代理”。 |
154
+ | 代理要求身份验证 | 代理的用户名和密码。 |
155
+ | 无法建立安全连接 | 在公司网络中,检查代理的证书设置。 |
156
+ | API 密钥无效或没有访问权限 | 模型配置中的 API 密钥。 |
157
+ | 请求超出模型的上下文窗口 | 模型配置中的上下文窗口是否与模型的实际值一致。开启上下文压缩时,iCode 会压缩上下文并重新发送一次请求,只有这次也失败时才会显示该错误。参见[配置上下文压缩](./compaction.md)。 |
158
+ | 模型配置的最大上下文窗口大于服务端支持的上限 | 在模型配置中把“最大上下文窗口”改为提示中给出的服务端上限或更小,并保存。 |