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,175 @@
1
+ # 安装和使用 Skills
2
+
3
+ Skill 是一组可复用的操作说明,可以附带参考资料和脚本,用于扩展智能体处理特定任务的能力。本指南介绍如何为“内置”类型的智能体安装 Skill、确认 Skill 已加载,以及使用 Skill。外部 ACP 智能体是否支持 Skill 以及如何配置,由外部智能体决定。
4
+
5
+ ## Skill 安装位置
6
+
7
+ 根据 Skill 的使用范围和共享需求,选择合适的安装位置:
8
+
9
+ | 位置 | 适合情况 | iCode 中的加载方式 |
10
+ | --- |--------------------------------------| --- |
11
+ | iCode 用户 Skill 目录 | 希望 iCode 中所有“内置”类型的智能体都能使用 | 始终自动加载 |
12
+ | Agent Skills 共享目录 | 希望在 iCode 与其他支持 Agent Skills 的工具之间共享 | 默认自动加载,可针对智能体关闭 |
13
+ | `<working-directory>/.agents/skills` | 只希望在当前工作目录中使用 | 勾选“加载项目 Skills”后才加载,也可针对智能体关闭 |
14
+ | 自定义目录 | 希望从指定位置加载 | 需要在相应智能体配置中手动添加 |
15
+
16
+ 其中,`<working-directory>` 表示当前工作目录。工作目录中的 Skill 随仓库而来,因此需要先在“设置 → 安全 → 项目信任”中勾选“加载项目 Skills”(`project.skills_enabled`),iCode 才会加载。工作目录中有未加载的 Skill 时,iCode 会弹出提示。切换工作目录后,iCode 会重新加载新工作目录中的 Skill。
17
+
18
+ 两个用户级 Skill 目录在不同平台上的路径如下:
19
+
20
+ | 目录 | macOS 和 Linux | Windows |
21
+ | --- | --- | --- |
22
+ | iCode 用户 Skill 目录 | `~/.chrys/skills` | `%APPDATA%\chrys\skills` |
23
+ | Agent Skills 共享目录 | `~/.agents/skills` | `%USERPROFILE%\.agents\skills` |
24
+
25
+ 对于前三种安装位置,将 Skill 目录复制或移动到对应位置即可。使用自定义目录时,无需移动 Skill,只需在相应智能体的配置中添加 Skill 所在目录。
26
+
27
+ iCode 会在已配置的 Skill 目录及其最多两层子目录中查找 `SKILL.md` 文件。找到 `SKILL.md` 后,将所在目录识别为一个 Skill 目录,不再继续查找其中嵌套的 Skill。
28
+
29
+ ## 安装并启用 Skill
30
+
31
+ iCode 用户 Skill 目录始终自动加载。Agent Skills 共享目录默认也会自动加载;当前工作目录中的 Skill 目录在勾选“加载项目 Skills”后加载。若曾在智能体配置中关闭对应来源,需要重新启用。使用自定义目录时,需要将目录添加到相应智能体的配置中。
32
+
33
+ 如需直接在智能体 YAML 中定义不带文件的内嵌 Skill,请参阅[智能体配置文件](../../reference/agent-profile.md#skillsinline)。
34
+
35
+ 如需检查或调整智能体的 Skill 配置,请按以下步骤操作:
36
+
37
+ 1. 在输入栏中输入 `/agents skills`,打开当前智能体的“Skills”标签页。如需配置其他智能体,在左侧列表中选择。
38
+ 2. 根据 Skill 所在位置,确认对应的 Skill 来源已启用:
39
+
40
+ * “从用户文件夹加载 Skills(如果存在)”对应 Agent Skills 共享目录;
41
+ * “从工作文件夹加载 Skills(如果存在)”对应 `<working-directory>/.agents/skills`,仅在“设置 → 安全 → 项目信任”中勾选了“加载项目 Skills”时生效。
42
+
43
+ 3. 如果 Skill 位于其他目录,点击“+ 添加”,填写 Skill 所在目录:
44
+
45
+ * 使用相对于工作目录的路径时,勾选“工作区相对路径”。
46
+ * 使用绝对路径时,取消勾选“工作区相对路径”。
47
+
48
+ 4. 如果 Skill 包含脚本,确认脚本扩展名已列入“允许的脚本扩展名”。默认启用 `.py`、`.sh` 和 `.ps1`;其他可选扩展名包括 `.ts`、`.js` 和 `.rb`。运行脚本所需的解释器必须已经安装。
49
+ 5. 如需调整 Skill 脚本的最长运行时间,在“脚本执行超时(秒)”中填写正整数。
50
+ 6. 点击“保存”。
51
+
52
+ > **注意**:Skill 脚本会作为本地进程运行,不受安全沙箱隔离。安装第三方 Skill 前,请检查 `SKILL.md`、脚本及其他相关文件,仅安装来自可信来源的 Skill。iCode 通过 `run_skill_script` 工具运行 Skill 脚本;该工具是否需要确认,取决于智能体审批规则和[当前审批模式](../configuration/approval.md)。
53
+
54
+ Skill 脚本向标准输出或标准错误输出超过 32 MiB 时,iCode 只保留这部分输出的开头和结尾,中间部分不会保存,结果中会告诉智能体有多少内容没有保留。
55
+
56
+ ## 确认 Skill 已加载
57
+
58
+ 保存智能体配置并返回会话后,iCode 会重新加载 Skill。如果直接在磁盘上添加 Skill 目录或修改其中的文件,iCode 不会实时监控这些变化。下一次发送消息时,iCode 会先重新扫描当前智能体已启用的 Skill 目录,再处理该消息。
59
+
60
+ 可通过以下任一方式确认 Skill 已加载:
61
+
62
+ * 在输入栏中输入 `/` 后,继续输入 Skill 名称(例如 `/release-`)。自动补全列表会随输入内容筛选匹配项;Skill 名称出现在“已加载 Skills”分组中,即表示已加载。
63
+ * 输入 `/runtime`,或点击输入栏上方状态栏右端显示的 Skill 数量,打开“运行时详情”窗口,然后在“Skills”标签页中查看 Skill 名称和来源。
64
+
65
+ 如果 Skill 未出现,请依次检查:
66
+
67
+ * 使用 Agent Skills 共享目录或工作目录 Skill 目录时,是否已启用对应选项(工作目录 Skill 目录还需勾选“加载项目 Skills”);使用自定义目录时,是否已将其添加到当前智能体。
68
+ * Skill 目录是否位于所选位置或其最多两层子目录中。
69
+ * Skill 是否符合[创建 Skill 的基本规范](#创建-skill-的基本规范)。
70
+
71
+ ## 使用 Skill
72
+
73
+ Skill 通常无需手动调用。当任务与某个 Skill 的描述匹配时,智能体会自动加载该 Skill 的完整说明,并按照其中的指引执行任务。例如:
74
+
75
+ ```text
76
+ 根据当前仓库从上一个版本以来的变更起草发布说明。
77
+ ```
78
+
79
+ 也可以在消息开头使用 `/skill-name` 显式调用已加载的 Skill。例如:
80
+
81
+ ```text
82
+ /release-notes 根据当前仓库从上一个版本以来的变更起草发布说明。
83
+ ```
84
+
85
+ 如果 Skill 名称与 iCode 的内置斜杠命令相同,则无法使用 `/skill-name` 显式调用该 Skill。此时,可以在消息中直接指定 Skill 名称,例如:
86
+
87
+ ```text
88
+ 使用 release-notes Skill,根据当前仓库从上一个版本以来的变更起草发布说明。
89
+ ```
90
+
91
+ 当前会话首次加载该 Skill 时,会显示 `load_skill` 工具调用卡片,其中包含 `release-notes` Skill 名称;随后智能体会按照 Skill 说明完成任务。
92
+
93
+ ## 同名 Skill 的优先级
94
+
95
+ 从前文列出的[Skill 安装位置](#skill-安装位置)加载的 Skill 都属于目录 Skill,每个 Skill 都包含 `SKILL.md`。iCode 还支持直接在智能体配置文件中定义内嵌 Skill,这类 Skill 不需要 Skill 目录或 `SKILL.md`。
96
+
97
+ 如果发现多个同名 Skill,iCode 只会加载优先级最高的一个。优先级从高到低依次为:
98
+
99
+ 1. 智能体“Skills”标签页中手动添加的目录,越靠上优先级越高(新添加的目录位于列表顶部);
100
+ 2. iCode 用户 Skill 目录;
101
+ 3. Agent Skills 共享目录;
102
+ 4. 当前工作目录中的 Skill;
103
+ 5. 智能体配置文件中的内嵌 Skill,按其定义顺序。
104
+
105
+ 如果同一个安装位置或自定义目录中存在多个同名 Skill,其发现顺序不确定。为确保加载指定版本,请仅保留其中一个。
106
+
107
+ ## 附录
108
+
109
+ ### 创建 Skill 的基本规范
110
+
111
+ 每个 Skill 使用独立目录,并在目录根层提供一个 `SKILL.md`。以下示例是一个可加载的最小 Skill:
112
+
113
+ ```markdown
114
+ ---
115
+ name: release-notes
116
+ description: 根据提交记录起草面向用户的发布说明
117
+ ---
118
+
119
+ # 起草发布说明
120
+
121
+ 1. 读取上一个版本以来的提交记录。
122
+ 2. 按新增、修复和兼容性变化分类。
123
+ 3. 只写用户可观察到的变化。
124
+ ```
125
+
126
+ #### 编写 `SKILL.md`
127
+
128
+ `SKILL.md` 需要使用 UTF-8 编码。文件开头是由 `---` 包围的 YAML 配置区,也称为 frontmatter;之后是提供给智能体的操作说明。frontmatter 应写成有效的 YAML 键值对象;若不是有效的 YAML,iCode 会尝试逐行读取并记录警告。iCode 按以下规则校验文件内容:
129
+
130
+ | 内容 | 加载要求 |
131
+ | --- | --- |
132
+ | frontmatter | 必须存在,且顶层内容应为 YAML 键值对象,不能使用锚点(`&`)或别名(`*`);长度不超过 16384 个字符,嵌套不超过 64 层 |
133
+ | `name` | 必填;必须与 Skill 目录名完全一致;长度为 1~64 个字符;只能包含小写字母、数字和连字符(`-`)。不能包含大写字母、下划线(`_`)等其他字符,也不能以连字符开头或结尾,不能包含连续连字符 |
134
+ | `description` | 必填;须为文本,长度不超过 1024 个字符。建议同时说明 Skill 用途和适用场景,帮助智能体判断何时加载 |
135
+ | `compatibility` | 可选;须为文本,长度不超过 500 个字符 |
136
+ | `license`、`allowed-tools` | 可选;iCode 读取其文本,但不额外校验其内容 |
137
+ | `metadata` | 可选;必须是值为纯文本或数字的 YAML 对象,否则 iCode 不会保留该字段 |
138
+ | 正文 | iCode 不额外限制长度或结构 |
139
+
140
+ 为了确保 Skill 能够稳定加载,请使用有效的 YAML 编写 frontmatter。缺少 frontmatter、`name` 或 `description`,或者字段值未通过上述校验时,iCode 不会加载该 Skill。可选字段写成列表或对象时会被忽略。
141
+
142
+ 几个可选字段分别用于:
143
+
144
+ * `compatibility`:说明 Skill 依赖的运行环境,例如适用的产品、所需的系统软件包或网络访问条件。
145
+ * `license`:声明 Skill 采用的许可证,可以填写许可证名称或 Skill 目录中许可证文件的名称。
146
+ * `allowed-tools`:按照 Agent Skills 规范声明可预先批准运行的工具。该字段仍处于实验阶段;iCode 当前只读取并保留字段值,不会据此自动授予工具权限。
147
+
148
+ iCode 的 Skill 目录和 `SKILL.md` 格式遵循 Agent Skills 通用规范。上述字段的详细写法和 Skill 的完整规范参阅 [Agent Skills 官方规范](https://agentskills.io/specification)。
149
+
150
+ #### 添加脚本和资源
151
+
152
+ Skill 可以按需附带脚本、参考资料和其他文本资源。
153
+
154
+ 例如:
155
+
156
+ ```text
157
+ release-notes/
158
+ ├── SKILL.md
159
+ ├── scripts/
160
+ │ └── collect.py
161
+ ├── references/
162
+ │ └── style-guide.md
163
+ └── assets/
164
+ └── template.html
165
+ ```
166
+
167
+ iCode 只会将以下扩展名的文本文件识别为 Skill 资源:`.md`、`.txt`、`.rst`、`.html`、`.htm`、`.xml`、`.svg`、`.json`、`.jsonl`、`.yaml`、`.yml`、`.toml`、`.csv`、`.tsv`、`.ini`、`.cfg`、`.css`。
168
+
169
+ 资源文件需要使用 UTF-8 编码。此外:
170
+
171
+ * 脚本扩展名必须列入智能体配置的“允许的脚本扩展名”。
172
+ * iCode 只读取 Skill 目录根层和直接子目录中的文件。例如,`guide.md` 和 `references/guide.md` 会被发现,`references/api/guide.md` 则会被忽略。
173
+ * iCode 会跳过 Skill 目录内部通过符号链接或 Windows 目录联接访问的文件和目录。这两类链接都指向磁盘中的其他位置;如需使用其中的内容,请将实际文件放入 Skill 目录。
174
+
175
+ 不符合扩展名、目录层级或链接规则的文件不会出现在 Skill 的资源或脚本清单中;资源不是有效的 UTF-8 文本时,会在读取时失败。这些情况不影响符合要求的 `SKILL.md` 加载。
@@ -0,0 +1,61 @@
1
+ # 使用 iCode ACP 服务
2
+
3
+ 支持智能体客户端协议(Agent Client Protocol,ACP)的编辑器或开发工具,可以连接 iCode,在客户端中使用 iCode 智能体。ACP 客户端提供交互界面,iCode 通过标准输入输出(stdio)与客户端通信,负责运行智能体、执行工具并保存会话。
4
+
5
+ 开始前,请先安装 iCode,并至少配置一个模型。有关准备步骤,参阅[开始使用 iCode](../../start/getting-started.md)和[配置模型](../configuration/models.md)。
6
+
7
+ ## 连接 iCode
8
+
9
+ 在 ACP 客户端的“添加智能体”或类似设置中,填写以下信息:
10
+
11
+ | 项目 | 值 |
12
+ | --- | --- |
13
+ | 可执行文件 | `icode` |
14
+ | 参数 | `acp` |
15
+
16
+ 这相当于客户端启动:
17
+
18
+ ```shell
19
+ icode acp
20
+ ```
21
+
22
+ 如果客户端只提供一个启动命令字段,则填写完整命令 `icode acp`。
23
+
24
+ 保存配置后,按以下步骤验证连接:
25
+
26
+ 1. 在客户端启动或连接 iCode。
27
+ 2. 新建会话并发送一条消息。
28
+ 3. 确认客户端显示 iCode 的回复。出现回复即表示连接配置成功。
29
+
30
+ ## 配置启动选项
31
+
32
+ `icode acp` 支持以下启动选项。若客户端分别设置可执行文件和参数,将这些选项追加到 `acp` 后。
33
+
34
+ | 选项 | 默认值 | 用途 |
35
+ | --- | --- | --- |
36
+ | `-a`、`--agent <agent>` | `Code` | 指定新会话使用的内置或自定义智能体;可使用名称、显示名称或 ID。恢复的会话沿用保存时的智能体。如需创建自定义智能体,参阅[配置智能体](../configuration/agents.md)。 |
37
+ | `--approval <mode>` | `manual` | 指定该 ACP 服务新建或恢复的每个会话的初始审批模式;可选 `manual`、`auto` 或 `bypass`。`bypass` 审批模式会跳过审批并直接执行工具调用,请谨慎使用。各审批模式的规则参阅[配置审批模式](../configuration/approval.md)。 |
38
+ | `-C`、`--workdir <directory>` | 无 | 为客户端未发送工作目录的会话提供默认工作目录。 |
39
+ | `--ask-user-timeout <seconds>` | 不限时 | 限制等待客户端回答智能体提问的时间;省略或设为 `0` 及负数时,不设置等待时限。 |
40
+
41
+ ## 工作目录和会话
42
+
43
+ 客户端在创建或恢复会话时,可以将项目的工作目录交给 iCode。客户端提供的工作目录必须是已存在的绝对路径。客户端未提供工作目录时,iCode 使用 `--workdir <project-directory>` 指定的目录;两者同时存在时,以客户端提供的工作目录为准。
44
+
45
+ iCode 会在启动时检查 `--workdir`。即使客户端随后会提供工作目录,该选项指定的目录也必须存在,否则 iCode 无法启动。
46
+
47
+ 会话数据不会写入工作目录,而是保存在 iCode 的会话存储目录中;有关实际保存位置,参阅[查找会话 ID 和会话保存位置](../daily-use/sessions.md#查找会话-id-和会话保存位置)。iCode 会记录会话创建时的工作目录。通过 ACP 客户端列出会话时,只会显示与当前工作目录匹配的会话;恢复会话时,如果工作目录不匹配,iCode 会拒绝恢复。
48
+
49
+ 通过 ACP 客户端使用的会话也会出现在 TUI 的“聊天会话”窗口中,勾选其中的“ACP”即可看到。参阅[恢复已有会话](../daily-use/sessions.md#恢复已有会话)。
50
+
51
+ ## 在客户端中完成交互
52
+
53
+ iCode 会将智能体回复和工具调用状态发送给客户端。客户端取消任务时,iCode 会中断当前任务。
54
+
55
+ 当前模型支持视觉输入时,提示中可以包含 PNG、JPEG、GIF 或 WebP 格式的图像。提示中的图像为其他格式时,iCode 会拒绝该提示,客户端会收到错误。
56
+
57
+ 如果客户端支持管理会话,关闭会话后仍可以在同一工作目录中恢复;删除会话会移除 iCode 保存的会话记录,之后无法在 iCode 中恢复。
58
+
59
+ 如果要在 ACP 客户端中使用提问功能,客户端需要支持 iCode 的 `_chrys/request_input` 扩展请求(在会自动添加下划线前缀的 ACP SDK 中显示为 `chrys/request_input`)。iCode 通过此请求向客户端发送智能体的问题,并接收用户回答;不支持该请求的客户端无法完成需要用户回答的任务。等待回答的时间可以通过 `--ask-user-timeout` 限制。
60
+
61
+ 客户端支持审批模式或模型切换时,可以更改当前会话的相应设置。这些切换与通过 `--approval` 设置的初始模式一样,都不会写入 iCode 的本地配置;但如果客户端使用 iCode 的扩展请求修改设置、智能体配置或模型配置,这些更改会写入 iCode 的本地配置。下次启动 ACP 服务时,初始审批模式仍只由 `--approval` 决定,其他初始设置按本地配置和当次启动参数确定。模型配置和可用智能体仍由 iCode 的本地配置管理。
@@ -0,0 +1,190 @@
1
+ # 使用 icode run 执行无界面任务
2
+
3
+ `icode run` 在终端中执行任务,完成后返回智能体的最终回复。它不打开终端用户界面(Terminal User Interface,TUI);任务运行期间,会逐行显示智能体正在做什么,适合一次性任务、脚本和自动化流程。
4
+
5
+ 本指南介绍 `icode run` 如何指定任务、智能体、模型、工作目录和会话,如何查看或隐藏运行进度,以及如何取得适合程序处理的 JSON 输出。
6
+
7
+ ## 开始前
8
+
9
+ 运行前需要完成以下准备:
10
+
11
+ - 已安装 iCode,并至少配置一个可用模型。请参阅[开始使用 iCode](../../start/getting-started.md)和[配置模型](../configuration/models.md)。
12
+ - 已确定要使用的智能体。内置的 `QA` 智能体在 TUI 中显示为“Q&A Agent”,其指令要求它不修改任何内容,但它可以执行 Shell 命令,且 `icode run` 执行这些命令前不会请求审批;`Code` 智能体可以修改文件和运行命令。自定义智能体的能力取决于其配置。请参阅[配置智能体](../configuration/agents.md)。
13
+ - 如任务可能修改文件,先保存未写入磁盘的工作,并在可恢复的工作目录中运行,例如已提交当前变更的 Git 仓库。
14
+
15
+ > **注意**
16
+ >
17
+ > `icode run` 始终绕过工具审批。智能体调用 Shell、写入文件或运行 Skill 时不会等待确认。只应在可信的工作目录中运行可信的智能体和任务。
18
+
19
+ `icode run` 在运行期间不能与人交互;应在启动前将任务要求和所需上下文写入提示词。
20
+
21
+ ## 执行任务
22
+
23
+ 在项目目录中运行命令,并通过 `-a` 或 `--agent` 指定智能体。任务文本含空格时使用引号:
24
+
25
+ ```shell
26
+ icode run "概述这个项目的目录结构和主要模块" --agent QA
27
+ ```
28
+
29
+ 任务运行期间,iCode 会显示运行进度;任务完成后,先显示一行汇总,再显示智能体的最终回复。例如:
30
+
31
+ ```text
32
+ • Q&A Agent ready · Example Model · session 8de5057d58ff · ~/projects/demo
33
+ I'll start with the top-level layout.
34
+ → shell ls
35
+ ✓ 0.1s
36
+ → read README.md
37
+ ✓ 0.0s
38
+
39
+ ✓ Done · 8.2s · 2 tool calls · session 8de5057d58ff
40
+ The project has three main parts: ...
41
+ ```
42
+
43
+ 各行的含义请参阅[查看运行进度](#查看运行进度)。回复中可能改动终端显示的控制字符会显示为 `�`;将输出重定向到文件或其他程序,或添加 `--json` 时,回复保持原样。若任务失败,错误信息写入标准错误(`stderr`),命令以非零状态退出。iCode 能判断模型请求失败的原因时,错误信息会说明原因,下方的 `detail:` 行显示原始错误信息。
44
+
45
+ 需要让智能体修改或验证代码时,可使用 `Code`:
46
+
47
+ ```shell
48
+ icode run "修复登录表单的验证错误,并运行相关测试" --agent Code
49
+ ```
50
+
51
+ 这类任务可能修改工作目录中的文件并执行命令;运行前应确认提示词、智能体和当前目录都符合预期。
52
+
53
+ 运行 `icode run -h` 或 `icode run --help` 可以查看当前版本支持的参数。
54
+
55
+ ## 查看运行进度
56
+
57
+ 进度行写入标准错误(`stderr`),最终回复写入标准输出(`stdout`)。在终端中两者都会显示;使用 `>` 保存回复或将回复交给其他程序时,只有回复会写入:
58
+
59
+ ```shell
60
+ icode run "为最近的改动撰写发布说明" --agent QA > notes.md
61
+ ```
62
+
63
+ 每一行表示一个步骤:
64
+
65
+ | 行 | 含义 |
66
+ | --- | --- |
67
+ | `• Q&A Agent ready · …` | 智能体已启动,并显示其模型、会话和工作目录。 |
68
+ | 普通文本 | 智能体在步骤之间说明的内容。 |
69
+ | `→ read README.md` | 智能体调用工具,此处为读取文件。 |
70
+ | `✓ 0.1s` 或 `✗ exit 1 · 2.5s` | 工具已完成,或已失败并附原因,以及耗时。 |
71
+ | `↳ Explore → grep TODO` | 子智能体的步骤,以子智能体名称开头。 |
72
+ | `↻ … Retrying in 7s (attempt 2/18)` | 模型请求因临时原因失败,将重试。 |
73
+ | `Todo 1/3 · → Running tests` | 智能体的待办列表已更新。 |
74
+ | `Warning: …` | 值得注意但不会中止任务的情况。 |
75
+ | `✓ Done · 8.2s · 2 tool calls · session …` | 任务已完成,显示耗时、智能体调用工具的次数和会话。 |
76
+
77
+ 如只需查看警告、错误和最终回复,可添加 `-q` 或 `--quiet`:
78
+
79
+ ```shell
80
+ icode run "概述这个项目" --agent QA --quiet
81
+ ```
82
+
83
+ ## 指定工作目录
84
+
85
+ `-C` 或 `--workdir` 指定智能体处理文件和执行命令时使用的工作目录,无需先在终端中切换目录:
86
+
87
+ ```shell
88
+ icode run "检查未提交的变更并说明风险" --agent QA --workdir <project-directory>
89
+ ```
90
+
91
+ 将 `<project-directory>` 替换为实际项目路径。可以使用绝对路径,或相对于运行命令时所在目录的路径;路径必须指向一个已有目录。
92
+
93
+ ## 从文件读取任务
94
+
95
+ 较长、需要版本管理或由脚本生成的任务可以放在文本文件中,再通过 `-t` 或 `--task` 读取:
96
+
97
+ ```shell
98
+ icode run --task prompts/review.md --agent Code --workdir <project-directory>
99
+ ```
100
+
101
+ `--task` 不要求特定文件后缀。iCode 会读取该文件内容,并将其作为本次任务的提示词。任务文件路径可以是绝对路径,也可以是相对路径;使用相对路径时,iCode 会在 `--workdir` 指定的目录中查找该文件,未指定 `--workdir` 时,则在运行命令时所在的目录中查找。
102
+
103
+ 一次运行只能使用一种提示词来源:直接传入提示词或使用 `--task`。两者不能同时使用。
104
+
105
+ ## 选择智能体和模型
106
+
107
+ `icode run` 必须通过 `--agent` 指定智能体。运行 `icode agents` 可以查看可用的智能体配置:
108
+
109
+ ```text
110
+ Default Name Display Name ID Model
111
+ * Code Code Agent b011c0de0001 active
112
+ QA Q&A Agent b0119a000005 Example Model
113
+ ```
114
+
115
+ 上述示例省略了部分行和列,`Example Model` 为虚构的模型配置。
116
+
117
+ `Name`、`Display Name` 和 `ID` 均可作为 `--agent` 的值。`Model` 为 `active` 表示使用当前生效的模型配置;显示具体名称表示使用已绑定的模型配置。
118
+
119
+ 对于使用 `active` 模型的智能体,可以通过 `-m` 或 `--model` 为本次运行指定模型配置;对于已绑定模型的智能体,`--model` 不生效。
120
+
121
+ 运行 `icode models` 可以查看可用的模型配置:
122
+
123
+ ```text
124
+ Active ID Name Provider API Model Context Flags
125
+ * 0123456789ab Example Model openai chat example-model 200k stream
126
+ ```
127
+
128
+ `Active` 列中的 `*` 表示默认生效的模型配置。`ID` 和 `Name` 均可作为 `--model` 的值。
129
+
130
+ ## 取得 JSON 输出
131
+
132
+ 添加 `--json` 后,成功结果以 JSON 对象写入标准输出(`stdout`),错误和警告以 JSON 对象写入标准错误(`stderr`),不显示运行进度。例如:
133
+
134
+ ```shell
135
+ icode run "hello" -a QA --json
136
+ ```
137
+
138
+ 以下是一次运行的实际输出:
139
+
140
+ ```json
141
+ {"session_id": "8de5057d-58ff-477e-9158-2f1b8d8e9fc0", "result": "Hello! I'm iCode, a read-only Q&A assistant for this codebase. I can help you with questions about the code, architecture, APIs, conventions, and how things work — with file and line references so you can jump straight to the source.\n\nWhat would you like to know?", "duration": 9.018}
142
+ ```
143
+
144
+ 其中,`session_id` 是本次任务所属的会话 ID,`result` 是智能体的最终回复,`duration` 是本次任务的耗时秒数。
145
+
146
+ 读取不存在的任务文件时:
147
+
148
+ ```shell
149
+ icode run --task missing.md -a QA --json
150
+ ```
151
+
152
+ 标准错误输出:
153
+
154
+ ```json
155
+ {"error": "Task file does not exist: missing.md", "code": "task_file_not_found"}
156
+ ```
157
+
158
+ `error` 是错误说明,`code` 是可供程序判断的错误类别。上述错误发生在会话创建前,因此没有 `session_id`;任务开始后发生错误(例如模型请求失败)时,输出还会包含 `session_id`。
159
+
160
+ ## 继续已有会话
161
+
162
+ 需要连续对话时,可使用 `-s` 或 `--session` 恢复已有会话,并基于已有对话继续提交任务。未指定 `-C` 或 `--workdir` 时,恢复后使用该会话保存时的工作目录,而不是执行命令所在的目录;指定 `-C` 或 `--workdir` 会改用指定目录。自动化任务需要确定文件操作位置时,应显式指定 `-C` 或 `--workdir`。如果该会话保存的工作目录已不存在,iCode 会提示错误并停止,此时可使用 `-C` 或 `--workdir` 在另一个目录中继续该会话。
163
+
164
+ 在无界面模式下,可从第一轮 JSON 输出的 `session_id` 字段获取会话 ID:
165
+
166
+ ```shell
167
+ icode run "检查当前改动并列出需要补充的测试" --agent Code --json
168
+ ```
169
+
170
+ 将返回的会话 ID 传给第二轮:
171
+
172
+ ```shell
173
+ icode run "根据上一轮的结果,补充缺少的测试" --agent Code -s <session-id> --json
174
+ ```
175
+
176
+ 其中 `<session-id>` 填写第一轮返回的会话 ID。
177
+
178
+ 通过 `icode run` 创建或继续的会话也会出现在 TUI 的“聊天会话”窗口中,勾选其中的“CLI”即可看到。参阅[恢复已有会话](../daily-use/sessions.md#恢复已有会话)。
179
+
180
+ ## 退出状态
181
+
182
+ 自动化脚本可以根据退出状态判断结果:
183
+
184
+ | 状态 | 含义 |
185
+ | --- | --- |
186
+ | `0` | 智能体已正常完成并返回最终回复。 |
187
+ | `1` | 配置、任务文件、智能体、模型、会话或任务执行出现错误。具体原因写入标准错误。 |
188
+ | `2` | 命令行参数无效,例如缺少 `--agent`,或同时提供或均未提供提示词和 `--task`。用法说明以纯文本写入标准错误,即使指定了 `--json` 也是如此。 |
189
+ | `124` | 内部操作超时。`icode run` 不限制任务的总运行时间。 |
190
+ | `130` | 运行被中断。 |
@@ -0,0 +1,239 @@
1
+ # 在浏览器中运行 iCode
2
+
3
+ `icode serve` 在浏览器中显示 iCode 的终端用户界面(Terminal User Interface,TUI),支持对话、审批工具调用和修改配置。
4
+
5
+ 启动选项可通过 `icode serve --help` 查看。
6
+
7
+ 本文将运行浏览器的设备称为“本机”,将运行 iCode 服务的机器称为“服务端”。服务端可以是本机,也可以是通过网络访问的远程服务器。
8
+
9
+ 开始前,服务端应已[安装 iCode](../../start/getting-started.md#1-安装-icode)。浏览器提供操作界面,iCode 则使用服务端的配置,以启动服务的系统用户权限读取、修改文件和执行命令。这些操作均发生在服务端,所有访问者共享服务端的配置、文件和会话,不会获得独立账户。
10
+
11
+ 首次登录后,如果尚未配置模型,需要先在浏览器界面中[配置模型](../../start/getting-started.md#3-配置模型),然后才能开始对话。任务运行期间应保持页面连接;关闭、刷新页面或断线都会中断该页面中正在执行的任务。
12
+
13
+ 根据服务端的位置和访问方式,参阅对应章节:
14
+
15
+ | 使用场景 | 操作章节 |
16
+ | --- | --- |
17
+ | 本机运行和访问 | [在本机启动 iCode](#在本机启动-icode) |
18
+ | 通过 SSH 访问远程服务器上的 iCode | [从本机访问远程 iCode](#从本机访问远程-icode) |
19
+ | 通过固定的 HTTPS 域名访问 | [通过固定的 HTTPS 域名访问](#通过固定的-https-域名访问) |
20
+
21
+ ## 在本机启动 iCode
22
+
23
+ ### 1. 启动服务
24
+
25
+ 在本机终端中进入工作目录,然后启动服务:
26
+
27
+ ```shell
28
+ icode serve --auth-required
29
+ ```
30
+
31
+ 按终端提示输入并确认浏览器登录密码,密码不能为空。`--auth-required` 启用密码登录;未指定认证选项时,无需登录即可访问。
32
+
33
+ 终端显示 `Serving iCode TUI on ...` 和访问地址后,表示服务已启动。
34
+
35
+ ### 2. 在浏览器中登录
36
+
37
+ 在本机浏览器中打开 `http://localhost:7777`,输入启动时设置的密码。`localhost` 表示本机,`7777` 是服务端口。
38
+
39
+ 登录后应显示 iCode 界面,服务端已有的模型配置会继续使用。确认模型已配置后,发送“你好”,检查是否能收到回复。
40
+
41
+ 启动时所在目录即为初始工作目录。点击对话区底部边框右侧的目录路径可[切换工作目录](../daily-use/workspaces.md#在会话中切换工作目录)。`icode serve` 不接受 TUI 的 `--workdir`、`--agent`、`--model` 或 `--session` 参数;更换智能体、模型和恢复会话均在页面中操作。
42
+
43
+ ### 3. 结束使用
44
+
45
+ 使用期间应保持服务终端运行。任务结束后,在该终端按 `Ctrl+C` 停止服务。
46
+
47
+ 每次打开页面并建立连接,服务端都会启动一个独立的 iCode 实例。对话记录保存在服务端,重新打开页面后,可[恢复已保存的会话](../daily-use/sessions.md#恢复已有会话)。
48
+
49
+ 浏览器登录状态有效期为 12 小时,服务重启后需重新登录。同一客户端地址连续 5 次输入错误密码后会被锁定,只能通过重启服务解除。重启会断开所有已连接的页面。
50
+
51
+ ## 从本机访问远程 iCode
52
+
53
+ 如果已能通过 SSH 登录远程服务器,可以建立 SSH 隧道,将本机浏览器的连接通过加密通道转发到远程 iCode,无需配置域名。以下步骤需要在本机打开两个终端窗口。
54
+
55
+ ### 1. 在第一个终端中登录远程服务器并启动 iCode
56
+
57
+ ```shell
58
+ ssh <user>@<server>
59
+ ```
60
+
61
+ 将 `<user>` 替换为服务器的 SSH 用户名,`<server>` 替换为其 IP 地址或主机名,使用 SSH 密钥或密码登录。
62
+
63
+ 登录后,在该终端中执行的命令会运行在远程服务器上。进入远程工作目录,然后启动 iCode:
64
+
65
+ ```shell
66
+ icode serve --auth-required
67
+ ```
68
+
69
+ 设置浏览器登录密码,确认终端显示服务地址,并保持终端运行。
70
+
71
+ ### 2. 在第二个终端中建立隧道
72
+
73
+ 在本机打开第二个终端,执行以下命令建立隧道:
74
+
75
+ ```shell
76
+ ssh -N -o ExitOnForwardFailure=yes -L 7777:localhost:7777 <user>@<server>
77
+ ```
78
+
79
+ 用户名和服务器地址与上一步相同。SSH 身份验证完成后,终端通常不再输出内容,也不返回命令提示符;保持终端运行。
80
+
81
+ 若 SSH 登录需指定其他端口或密钥,两条命令均需添加相同的连接选项。
82
+
83
+ ### 3. 在本机浏览器中访问
84
+
85
+ 访问 `http://localhost:7777`,输入第一步设置的 iCode 浏览器登录密码。
86
+
87
+ 浏览器访问本机的 `localhost:7777` 后,SSH 隧道会将连接转发到远程 iCode。因此,本例中的浏览器地址应保持为 `localhost`,不能改为远程 IP。
88
+
89
+ 任务结束后,在第一个终端按 `Ctrl+C` 停止 iCode,在第二个终端按 `Ctrl+C` 关闭 SSH 隧道。
90
+
91
+ ## 通过固定的 HTTPS 域名访问
92
+
93
+ 通过 `https://icode.example.com` 等固定地址访问时,需部署反向代理:浏览器与代理建立加密连接,代理再将请求转发至 iCode。
94
+
95
+ 本节适用于已有 HTTPS 代理的环境。域名和证书需要在代理侧配置,iCode 本身不提供 HTTPS 服务。
96
+
97
+ ### 1. 启动 iCode
98
+
99
+ 以下示例要求代理与 iCode 运行在同一台服务器上。在服务器终端中进入工作目录,将 `icode.example.com` 替换为实际域名,然后运行:
100
+
101
+ ```shell
102
+ icode serve --host 127.0.0.1 --port 7777 --public-url https://icode.example.com --auth-required
103
+ ```
104
+
105
+ 设置浏览器登录密码,并保持终端运行。此命令让 iCode 只接受同一台服务器上的连接,浏览器则通过代理访问 `--public-url` 指定的地址。
106
+
107
+ ### 2. 配置代理连接
108
+
109
+ 代理需满足以下要求:
110
+
111
+ - 将该域名的请求转发至 `http://127.0.0.1:7777`。
112
+ - 保留浏览器请求中的原始 `Host` 头,使 iCode 能核对访问域名。
113
+ - 支持 WebSocket 连接,供页面持续传输输入和回复。
114
+
115
+ 默认情况下,iCode 按代理地址累计密码错误次数,多个访问者可能共享失败计数。若代理可信且会正确重写 `X-Forwarded-For`(客户端地址请求头),可在 iCode 启动命令中添加 `--auth-trust-forwarded-for`,改为按代理提供的访问者地址计数。
116
+
117
+ ### 3. 验证访问
118
+
119
+ 将 `icode.example.com` 替换为实际域名,在本机浏览器中打开对应的 HTTPS 地址,例如 `https://icode.example.com`,无需添加 iCode 的端口 `:7777`。浏览器应显示 iCode 登录页面,且没有证书警告。登录后发送一条消息,确认能收到回复。
120
+
121
+ 浏览器到代理的连接已加密;代理到 iCode 仍使用服务器内部的 HTTP 连接。
122
+
123
+ ### 其他部署方式
124
+
125
+ 代理位于其他服务器或独立容器中时,`127.0.0.1` 可能无法连接 iCode。调整监听地址后,应通过防火墙或容器网络规则限制后端端口仅供可信代理访问,避免绕过 HTTPS 代理直接连接。设置 HTTPS `--public-url` 不会加密代理到 iCode 的 HTTP 连接。
126
+
127
+ ## 从文件或环境变量读取密码
128
+
129
+ 无法在终端交互输入密码时,可通过文件或环境变量提供。两种方式均自动启用认证,无需添加 `--auth-required`,且不能同时使用。
130
+
131
+ ### 使用密码文件
132
+
133
+ 在服务端准备一个 UTF-8 纯文本文件,将登录密码写入文件。密码不能为空,文件末尾的换行会被忽略。
134
+
135
+ 进入工作目录,指定密码文件启动:
136
+
137
+ ```shell
138
+ icode serve --auth-password-file "<password-file>"
139
+ ```
140
+
141
+ 将 `<password-file>` 替换为服务端的密码文件路径。启动时不再提示输入密码,浏览器使用文件中的密码登录。
142
+
143
+ ### 使用环境变量
144
+
145
+ 在服务端为 iCode 启动进程设置环境变量,例如 `CHRYS_SERVE_PASSWORD`,并将变量值设为非空的登录密码。然后运行:
146
+
147
+ ```shell
148
+ icode serve --auth-password-env CHRYS_SERVE_PASSWORD
149
+ ```
150
+
151
+ `--auth-password-env` 的参数为环境变量名称。启动时不再提示输入密码,浏览器使用该变量的值登录。
152
+
153
+ ## 直接通过局域网 IP 访问
154
+
155
+ 直接通过局域网 IP 访问会以明文传输登录密码和对话内容,仅适用于明确接受此风险的网络环境。
156
+
157
+ 在服务端进入工作目录,将 `192.168.1.20` 替换为服务端实际的局域网 IP,然后运行:
158
+
159
+ ```shell
160
+ icode serve --host 0.0.0.0 --public-url http://192.168.1.20:7777 --auth-required --allow-insecure-auth
161
+ ```
162
+
163
+ `--host 0.0.0.0` 允许其他设备连接 iCode。`--allow-insecure-auth` 显式允许通过网络进行明文密码登录;本例未指定该选项时,iCode 会拒绝启动。
164
+
165
+ 在本机浏览器中使用服务端的实际局域网 IP 访问,例如 `http://192.168.1.20:7777`,然后登录。若无法连接,检查本机与服务端是否互通,以及服务端防火墙是否允许客户端访问 TCP 端口 `7777`。
166
+
167
+ ## 故障排查
168
+
169
+ ### 提示找不到 `icode` 命令
170
+
171
+ 确认服务端已安装 iCode,且安装目录已加入 `PATH`。若刚完成安装,重新打开终端后运行以下命令验证:
172
+
173
+ ```shell
174
+ icode --version
175
+ ```
176
+
177
+ ### 本机启动提示端口被占用
178
+
179
+ 通过 `--port` 指定一个空闲端口,并在浏览器地址中使用相同端口。例如,若 `8888` 空闲:
180
+
181
+ ```shell
182
+ icode serve --port 8888 --auth-required
183
+ ```
184
+
185
+ 然后访问 `http://localhost:8888`。
186
+
187
+ ### SSH 隧道提示本地端口被占用
188
+
189
+ 将 `-L` 后的第一个端口改为本机空闲端口,最后一个端口保持为远程 iCode 的监听端口。例如,远程 iCode 使用 `7777`,且本机的 `8888` 端口空闲时,可在本机运行:
190
+
191
+ ```shell
192
+ ssh -N -o ExitOnForwardFailure=yes -L 8888:localhost:7777 <user>@<server>
193
+ ```
194
+
195
+ 将 `<user>` 和 `<server>` 替换为 SSH 用户名和服务器地址。同时在远程服务器上重新启动 iCode,指定新的浏览器访问地址:
196
+
197
+ ```shell
198
+ icode serve --public-url http://localhost:8888 --auth-required
199
+ ```
200
+
201
+ 然后在本机访问 `http://localhost:8888`。
202
+
203
+ ### 浏览器提示无法访问
204
+
205
+ 先确认 iCode 服务仍在运行,再核对浏览器地址是否与所用方式一致:按本机或 SSH 示例访问时使用 `localhost`,通过 HTTPS 访问时使用配置的域名,通过局域网直连时使用服务端 IP。
206
+
207
+ 如果地址正确但仍无法访问,SSH 方式还需检查隧道是否运行,HTTPS 方式则需检查域名解析和代理服务。
208
+
209
+ ### HTTPS 页面出现证书警告
210
+
211
+ 确认浏览器使用了配置的域名,并检查代理证书是否过期、是否与域名匹配,以及浏览器是否信任其签发机构。
212
+
213
+ ### HTTPS 页面返回 `502`
214
+
215
+ 检查 iCode 是否仍在运行、代理转发的地址和端口是否与 iCode 的监听配置一致,以及代理是否能连接该地址;具体原因可查看代理日志。
216
+
217
+ ### 页面返回 `421`
218
+
219
+ 使用 iCode 启动时显示的域名或 IP 及端口访问。经代理访问时,检查代理是否保留了原始 `Host` 头。
220
+
221
+ ### WebSocket 连接返回 `403`
222
+
223
+ 核对浏览器地址是否与 `--public-url` 指定的地址一致,包括协议(`http` 或 `https`)、域名和端口。iCode 会拒绝来源地址不匹配的连接。
224
+
225
+ ### 登录时返回 `403`
226
+
227
+ 若提示 `Invalid login token`,重新打开登录页面后输入密码;若提示 `Invalid login origin`,核对浏览器地址是否与 iCode 配置的访问地址一致。
228
+
229
+ ### 提示密码尝试次数过多
230
+
231
+ 该客户端地址已锁定。先确认其他页面没有正在执行的任务,再在 iCode 终端按 `Ctrl+C` 并重新启动。多个代理访问者同时被锁定时,按 HTTPS 章节中的条件检查是否适合启用 `--auth-trust-forwarded-for`。
232
+
233
+ ### 页面刷新或断线后未显示原对话
234
+
235
+ 页面重新连接后,服务端会启动新的 iCode 实例。可按“恢复已保存的会话”中的步骤恢复对话记录,但中断的任务不会自动继续。
236
+
237
+ ### 复制失败
238
+
239
+ 若出现复制对话框,点击 **Copy**。仍失败时,选中对话框中的文字,使用浏览器的复制快捷键手动复制。