illusion-code 0.2.3__tar.gz → 0.2.4__tar.gz

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 (515) hide show
  1. {illusion_code-0.2.3 → illusion_code-0.2.4}/PKG-INFO +1 -1
  2. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/package-lock.json +2 -2
  3. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/package.json +1 -1
  4. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/version.ts +1 -1
  5. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/package-lock.json +2 -2
  6. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/package.json +1 -1
  7. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/App.tsx +140 -76
  8. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/components/ChatArea.tsx +23 -4
  9. illusion_code-0.2.4/frontend/web/src/components/ErrorBoundary.tsx +103 -0
  10. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/components/PromptInput.tsx +21 -2
  11. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/components/Sidebar.tsx +13 -5
  12. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/components/Toolbar.tsx +36 -26
  13. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/hooks/useWebSocketSession.ts +109 -169
  14. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/i18n.ts +14 -0
  15. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/main.tsx +5 -1
  16. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/types/protocol.ts +59 -2
  17. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/version.ts +1 -1
  18. {illusion_code-0.2.3 → illusion_code-0.2.4}/pyproject.toml +1 -1
  19. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/__init__.py +1 -1
  20. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/ui/protocol.py +53 -3
  21. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/ui/web/ws_host.py +151 -141
  22. illusion_code-0.2.4/src/illusion/ui/web/ws_web_api.py +669 -0
  23. illusion_code-0.2.4/tests/ui/test_protocol_web.py +103 -0
  24. illusion_code-0.2.4/tests/ui/test_web_api.py +459 -0
  25. {illusion_code-0.2.3 → illusion_code-0.2.4}/.github/workflows/publish.yml +0 -0
  26. {illusion_code-0.2.3 → illusion_code-0.2.4}/.gitignore +0 -0
  27. {illusion_code-0.2.3 → illusion_code-0.2.4}/.python-version +0 -0
  28. {illusion_code-0.2.3 → illusion_code-0.2.4}/LICENSE +0 -0
  29. {illusion_code-0.2.3 → illusion_code-0.2.4}/README.md +0 -0
  30. {illusion_code-0.2.3 → illusion_code-0.2.4}/README.zh-CN.md +0 -0
  31. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/en/architecture.md +0 -0
  32. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/en/channels.md +0 -0
  33. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/en/commands.md +0 -0
  34. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/en/extensions.md +0 -0
  35. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/en/getting-started.md +0 -0
  36. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/en/introduction.md +0 -0
  37. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/en/project-files.md +0 -0
  38. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/en/settings.md +0 -0
  39. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/images/IllusionCode.png +0 -0
  40. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/images/image1.png +0 -0
  41. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/images/image2.png +0 -0
  42. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/zh-CN/architecture.md +0 -0
  43. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/zh-CN/channels.md +0 -0
  44. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/zh-CN/commands.md +0 -0
  45. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/zh-CN/extensions.md +0 -0
  46. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/zh-CN/getting-started.md +0 -0
  47. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/zh-CN/introduction.md +0 -0
  48. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/zh-CN/project-files.md +0 -0
  49. {illusion_code-0.2.3 → illusion_code-0.2.4}/docs/zh-CN/settings.md +0 -0
  50. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/build.mjs +0 -0
  51. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/App.tsx +0 -0
  52. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/CommandPicker.tsx +0 -0
  53. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/Composer.tsx +0 -0
  54. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/ComposerController.tsx +0 -0
  55. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/ConversationView.tsx +0 -0
  56. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/Footer.tsx +0 -0
  57. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/MarkdownContent.tsx +0 -0
  58. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/MarkdownTable.tsx +0 -0
  59. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/ModalHost.tsx +0 -0
  60. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/MultilineTextInput.tsx +0 -0
  61. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/PromptInput.tsx +0 -0
  62. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/SelectModal.tsx +0 -0
  63. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/SidePanel.tsx +0 -0
  64. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/Spinner.tsx +0 -0
  65. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/StatusBar.tsx +0 -0
  66. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/SwarmPanel.tsx +0 -0
  67. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/TodoPanel.tsx +0 -0
  68. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/ToolCallDisplay.tsx +0 -0
  69. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/TranscriptPane.tsx +0 -0
  70. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/components/WelcomeBanner.tsx +0 -0
  71. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/hooks/useAnimationFrame.ts +0 -0
  72. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/hooks/useBackendSession.ts +0 -0
  73. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/hooks/useBlink.ts +0 -0
  74. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/hooks/useTerminalSize.ts +0 -0
  75. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/i18n.ts +0 -0
  76. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/index.tsx +0 -0
  77. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/theme/ThemeContext.tsx +0 -0
  78. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/theme/builtinThemes.ts +0 -0
  79. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/ToolInterface.ts +0 -0
  80. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/AgentTool.ts +0 -0
  81. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/BashTool.ts +0 -0
  82. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/CronTool.ts +0 -0
  83. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/EditTool.ts +0 -0
  84. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/GenericTool.ts +0 -0
  85. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/LspTool.ts +0 -0
  86. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/McpTool.ts +0 -0
  87. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/NotebookTool.ts +0 -0
  88. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/PlanTool.ts +0 -0
  89. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/ReadTool.ts +0 -0
  90. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/SearchTool.ts +0 -0
  91. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/SkillTool.ts +0 -0
  92. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/TaskTool.ts +0 -0
  93. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/WebTool.ts +0 -0
  94. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/WorktreeTool.ts +0 -0
  95. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/implementations/WriteTool.ts +0 -0
  96. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/tools/registry.ts +0 -0
  97. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/types.ts +0 -0
  98. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/utils/markdown.ts +0 -0
  99. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/src/utils/thinking.ts +0 -0
  100. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/terminal/tsconfig.json +0 -0
  101. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/index.html +0 -0
  102. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/postcss.config.js +0 -0
  103. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/components/MessageBubble.tsx +0 -0
  104. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/components/ModalCard.tsx +0 -0
  105. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/components/RightPanel.tsx +0 -0
  106. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/components/TodoPanel.tsx +0 -0
  107. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/components/WelcomeScreen.tsx +0 -0
  108. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/index.css +0 -0
  109. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/remarkSuperscript.ts +0 -0
  110. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/src/vite-env.d.ts +0 -0
  111. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/tailwind.config.js +0 -0
  112. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/tsconfig.json +0 -0
  113. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/tsconfig.node.json +0 -0
  114. {illusion_code-0.2.3 → illusion_code-0.2.4}/frontend/web/vite.config.ts +0 -0
  115. {illusion_code-0.2.3 → illusion_code-0.2.4}/scripts/build_frontend.py +0 -0
  116. {illusion_code-0.2.3 → illusion_code-0.2.4}/scripts/hatch_build.py +0 -0
  117. {illusion_code-0.2.3 → illusion_code-0.2.4}/scripts/publish.py +0 -0
  118. {illusion_code-0.2.3 → illusion_code-0.2.4}/scripts/sync_version.py +0 -0
  119. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/__main__.py +0 -0
  120. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/api/__init__.py +0 -0
  121. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/api/client.py +0 -0
  122. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/api/codex_client.py +0 -0
  123. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/api/compat.py +0 -0
  124. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/api/effort.py +0 -0
  125. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/api/errors.py +0 -0
  126. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/api/openai_client.py +0 -0
  127. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/api/provider.py +0 -0
  128. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/api/registry.py +0 -0
  129. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/api/usage.py +0 -0
  130. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/auth/__init__.py +0 -0
  131. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/auth/codex_oauth.py +0 -0
  132. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/auth/copilot.py +0 -0
  133. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/auth/external.py +0 -0
  134. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/auth/flows.py +0 -0
  135. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/auth/manager.py +0 -0
  136. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/auth/storage.py +0 -0
  137. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/bridge/__init__.py +0 -0
  138. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/bridge/manager.py +0 -0
  139. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/bridge/session_runner.py +0 -0
  140. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/bridge/types.py +0 -0
  141. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/bridge/work_secret.py +0 -0
  142. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/__init__.py +0 -0
  143. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/base.py +0 -0
  144. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/base_commands.py +0 -0
  145. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/config.py +0 -0
  146. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/feishu/__init__.py +0 -0
  147. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/feishu/adapter.py +0 -0
  148. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/feishu/commands.py +0 -0
  149. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/feishu/messaging.py +0 -0
  150. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/feishu/session_map.py +0 -0
  151. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/feishu/ws_client.py +0 -0
  152. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/pid.py +0 -0
  153. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/qq/__init__.py +0 -0
  154. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/qq/adapter.py +0 -0
  155. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/qq/api.py +0 -0
  156. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/qq/commands.py +0 -0
  157. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/qq/session_map.py +0 -0
  158. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/qq/ws_client.py +0 -0
  159. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/serve.py +0 -0
  160. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/tools/__init__.py +0 -0
  161. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/tools/feishu_doc.py +0 -0
  162. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/tools/feishu_drive.py +0 -0
  163. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/weixin/__init__.py +0 -0
  164. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/weixin/adapter.py +0 -0
  165. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/weixin/commands.py +0 -0
  166. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/weixin/ilink_api.py +0 -0
  167. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/channels/weixin/session_map.py +0 -0
  168. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/cli.py +0 -0
  169. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/__init__.py +0 -0
  170. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/auth.py +0 -0
  171. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/bridge.py +0 -0
  172. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/context.py +0 -0
  173. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/git.py +0 -0
  174. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/helpers.py +0 -0
  175. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/__init__.py +0 -0
  176. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/analysis/__init__.py +0 -0
  177. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/analysis/architecture.py +0 -0
  178. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/analysis/conventions.py +0 -0
  179. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/analysis/dependencies.py +0 -0
  180. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/analysis/key_modules.py +0 -0
  181. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/extraction/__init__.py +0 -0
  182. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/extraction/lsp_symbols.py +0 -0
  183. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/extraction/readme.py +0 -0
  184. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/extraction/scanner.py +0 -0
  185. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/generation/__init__.py +0 -0
  186. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/generation/claudemd.py +0 -0
  187. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/generation/illusionmd.py +0 -0
  188. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/generation/memory_template.py +0 -0
  189. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/generation/rules.py +0 -0
  190. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/generation/sections.py +0 -0
  191. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/orchestrator.py +0 -0
  192. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/init/types.py +0 -0
  193. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/mcp.py +0 -0
  194. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/memory.py +0 -0
  195. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/misc.py +0 -0
  196. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/model.py +0 -0
  197. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/plugin.py +0 -0
  198. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/registry.py +0 -0
  199. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/rules.py +0 -0
  200. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/sandbox.py +0 -0
  201. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/session.py +0 -0
  202. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/settings.py +0 -0
  203. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/commands/types.py +0 -0
  204. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/config/__init__.py +0 -0
  205. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/config/i18n.py +0 -0
  206. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/config/paths.py +0 -0
  207. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/config/plan_file.py +0 -0
  208. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/config/settings.py +0 -0
  209. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/coordinator/__init__.py +0 -0
  210. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/coordinator/agent_definitions.py +0 -0
  211. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/coordinator/coordinator_mode.py +0 -0
  212. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/engine/__init__.py +0 -0
  213. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/engine/cost_tracker.py +0 -0
  214. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/engine/messages.py +0 -0
  215. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/engine/query.py +0 -0
  216. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/engine/query_engine.py +0 -0
  217. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/engine/stream_events.py +0 -0
  218. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/hooks/__init__.py +0 -0
  219. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/hooks/events.py +0 -0
  220. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/hooks/executor.py +0 -0
  221. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/hooks/hot_reload.py +0 -0
  222. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/hooks/loader.py +0 -0
  223. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/hooks/register_hooks.py +0 -0
  224. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/hooks/schemas.py +0 -0
  225. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/hooks/session_hooks.py +0 -0
  226. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/hooks/types.py +0 -0
  227. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/hooks/utils.py +0 -0
  228. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/mcp/__init__.py +0 -0
  229. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/mcp/client.py +0 -0
  230. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/mcp/config.py +0 -0
  231. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/mcp/types.py +0 -0
  232. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/memory/__init__.py +0 -0
  233. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/memory/manager.py +0 -0
  234. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/memory/memdir.py +0 -0
  235. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/memory/paths.py +0 -0
  236. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/memory/scan.py +0 -0
  237. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/memory/search.py +0 -0
  238. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/memory/types.py +0 -0
  239. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/output_styles/__init__.py +0 -0
  240. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/output_styles/loader.py +0 -0
  241. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/permissions/__init__.py +0 -0
  242. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/permissions/checker.py +0 -0
  243. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/permissions/loader.py +0 -0
  244. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/permissions/modes.py +0 -0
  245. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/permissions/schemas.py +0 -0
  246. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/platforms.py +0 -0
  247. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/plugins/__init__.py +0 -0
  248. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/plugins/installer.py +0 -0
  249. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/plugins/loader.py +0 -0
  250. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/plugins/options.py +0 -0
  251. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/plugins/schemas.py +0 -0
  252. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/plugins/types.py +0 -0
  253. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/prompts/__init__.py +0 -0
  254. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/prompts/claudemd.py +0 -0
  255. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/prompts/context.py +0 -0
  256. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/prompts/environment.py +0 -0
  257. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/prompts/system_prompt.py +0 -0
  258. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/sandbox/__init__.py +0 -0
  259. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/sandbox/adapter.py +0 -0
  260. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/sandbox/platforms/__init__.py +0 -0
  261. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/sandbox/platforms/base.py +0 -0
  262. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/sandbox/platforms/linux.py +0 -0
  263. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/sandbox/platforms/macos.py +0 -0
  264. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/sandbox/platforms/windows.py +0 -0
  265. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/sandbox/proxy/__init__.py +0 -0
  266. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/sandbox/proxy/env_vars.py +0 -0
  267. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/sandbox/runtime.py +0 -0
  268. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/sandbox/symlink_protection.py +0 -0
  269. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/sandbox/utils.py +0 -0
  270. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/sandbox/violation_store.py +0 -0
  271. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/__init__.py +0 -0
  272. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/compact/__init__.py +0 -0
  273. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/compact/auto_compact.py +0 -0
  274. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/compact/compact_core.py +0 -0
  275. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/compact/compact_prompt.py +0 -0
  276. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/compact/constants.py +0 -0
  277. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/compact/message_ops.py +0 -0
  278. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/compact/microcompact.py +0 -0
  279. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/compact/models.py +0 -0
  280. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/compact/token_utils.py +0 -0
  281. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/cron.py +0 -0
  282. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/cron_scheduler.py +0 -0
  283. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/file_history.py +0 -0
  284. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/lsp/__init__.py +0 -0
  285. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/lsp/client.py +0 -0
  286. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/lsp/config.py +0 -0
  287. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/lsp/manager.py +0 -0
  288. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/lsp/types.py +0 -0
  289. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/session_storage.py +0 -0
  290. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/services/token_estimation.py +0 -0
  291. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/skills/__init__.py +0 -0
  292. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/skills/bundled/__init__.py +0 -0
  293. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/skills/bundled/content/batch.md +0 -0
  294. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/skills/bundled/content/debug.md +0 -0
  295. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/skills/bundled/content/loop.md +0 -0
  296. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/skills/bundled/content/remember.md +0 -0
  297. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/skills/bundled/content/simplify.md +0 -0
  298. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/skills/bundled/content/skillify.md +0 -0
  299. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/skills/bundled/content/stuck.md +0 -0
  300. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/skills/bundled/content/update-config.md +0 -0
  301. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/skills/bundled/content/verify.md +0 -0
  302. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/skills/loader.py +0 -0
  303. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/skills/registry.py +0 -0
  304. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/skills/types.py +0 -0
  305. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/state/__init__.py +0 -0
  306. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/state/app_state.py +0 -0
  307. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/state/store.py +0 -0
  308. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/swarm/__init__.py +0 -0
  309. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/swarm/agent_executor.py +0 -0
  310. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/swarm/in_process.py +0 -0
  311. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/swarm/subprocess_backend.py +0 -0
  312. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/swarm/team_helpers.py +0 -0
  313. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/swarm/types.py +0 -0
  314. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/swarm/worktree.py +0 -0
  315. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tasks/__init__.py +0 -0
  316. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tasks/local_agent_task.py +0 -0
  317. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tasks/local_shell_task.py +0 -0
  318. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tasks/manager.py +0 -0
  319. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tasks/stop_task.py +0 -0
  320. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tasks/types.py +0 -0
  321. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/__init__.py +0 -0
  322. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/agent_tool.py +0 -0
  323. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/ask_user_question_tool.py +0 -0
  324. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/base.py +0 -0
  325. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/bash_tool.py +0 -0
  326. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/config_tool.py +0 -0
  327. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/cron_tool.py +0 -0
  328. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/enter_plan_mode_tool.py +0 -0
  329. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/enter_worktree_tool.py +0 -0
  330. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/exit_plan_mode_tool.py +0 -0
  331. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/exit_worktree_tool.py +0 -0
  332. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/file_edit_tool.py +0 -0
  333. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/file_read_tool.py +0 -0
  334. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/file_write_tool.py +0 -0
  335. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/glob_tool.py +0 -0
  336. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/grep_tool.py +0 -0
  337. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/list_mcp_resources_tool.py +0 -0
  338. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/lsp_formatters.py +0 -0
  339. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/lsp_schemas.py +0 -0
  340. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/lsp_tool.py +0 -0
  341. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/mcp_auth_tool.py +0 -0
  342. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/mcp_tool.py +0 -0
  343. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/notebook_edit_tool.py +0 -0
  344. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/powershell_tool.py +0 -0
  345. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/read_mcp_resource_tool.py +0 -0
  346. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/repl_tool.py +0 -0
  347. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/send_message_tool.py +0 -0
  348. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/shell_common.py +0 -0
  349. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/skill_tool.py +0 -0
  350. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/sleep_tool.py +0 -0
  351. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/structured_output_tool.py +0 -0
  352. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/task_create_tool.py +0 -0
  353. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/task_get_tool.py +0 -0
  354. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/task_list_tool.py +0 -0
  355. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/task_output_tool.py +0 -0
  356. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/task_stop_tool.py +0 -0
  357. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/task_update_tool.py +0 -0
  358. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/team_create_tool.py +0 -0
  359. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/team_delete_tool.py +0 -0
  360. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/todo_write_tool.py +0 -0
  361. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/tool_search_tool.py +0 -0
  362. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/web_fetch_tool.py +0 -0
  363. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/tools/web_search_tool.py +0 -0
  364. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/ui/__init__.py +0 -0
  365. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/ui/app.py +0 -0
  366. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/ui/backend_host.py +0 -0
  367. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/ui/input.py +0 -0
  368. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/ui/output.py +0 -0
  369. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/ui/permission_dialog.py +0 -0
  370. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/ui/permission_store.py +0 -0
  371. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/ui/react_launcher.py +0 -0
  372. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/ui/runtime.py +0 -0
  373. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/ui/textual_app.py +0 -0
  374. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/ui/web/__init__.py +0 -0
  375. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/ui/web/server.py +0 -0
  376. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/utils/__init__.py +0 -0
  377. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/utils/ripgrep.py +0 -0
  378. {illusion_code-0.2.3 → illusion_code-0.2.4}/src/illusion/utils/shell.py +0 -0
  379. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/__init__.py +0 -0
  380. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/api/test_anthropic_client.py +0 -0
  381. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/api/test_client.py +0 -0
  382. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/api/test_codex_client.py +0 -0
  383. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/api/test_effort.py +0 -0
  384. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/api/test_fallback/346/217/220/347/244/272.py" +0 -0
  385. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/api/test_openai_client.py +0 -0
  386. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/__init__.py +0 -0
  387. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/feishu/__init__.py +0 -0
  388. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/feishu/test_adapter.py +0 -0
  389. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/feishu/test_commands.py +0 -0
  390. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/feishu/test_session_map.py +0 -0
  391. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/test_base.py +0 -0
  392. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/test_base_commands.py +0 -0
  393. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/test_config.py +0 -0
  394. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/test_pid.py +0 -0
  395. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/test_tool_registration.py +0 -0
  396. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/tools/__init__.py +0 -0
  397. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/tools/test_feishu_doc.py +0 -0
  398. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/tools/test_feishu_drive.py +0 -0
  399. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/weixin/__init__.py +0 -0
  400. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/weixin/test_adapter.py +0 -0
  401. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/weixin/test_config.py +0 -0
  402. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/weixin/test_ilink_api.py +0 -0
  403. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/channels/weixin/test_session_map.py +0 -0
  404. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/commands/init/__init__.py +0 -0
  405. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/commands/init/test_claudemd.py +0 -0
  406. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/commands/init/test_orchestrator.py +0 -0
  407. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/commands/init/test_scanner.py +0 -0
  408. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/commands/init/test_sections.py +0 -0
  409. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/commands/test_effort_command.py +0 -0
  410. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/config/test_i18n.py +0 -0
  411. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/config/test_settings.py +0 -0
  412. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/conftest.py +0 -0
  413. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/engine/test_query_engine.py +0 -0
  414. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/fixtures/fake_mcp_server.py +0 -0
  415. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/integration/test_effort_integration.py +0 -0
  416. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/services/lsp/test_lsp_client.py +0 -0
  417. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/services/lsp/test_lsp_config.py +0 -0
  418. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/services/lsp/test_lsp_manager.py +0 -0
  419. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/services/lsp/test_lsp_types.py +0 -0
  420. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_api/__init__.py +0 -0
  421. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_api/test_client.py +0 -0
  422. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_api/test_codex_client.py +0 -0
  423. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_api/test_compat.py +0 -0
  424. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_api/test_openai_client.py +0 -0
  425. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_auth/test_external.py +0 -0
  426. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_bridge/test_core.py +0 -0
  427. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_bridge/test_session_flow.py +0 -0
  428. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_commands/__init__.py +0 -0
  429. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_commands/test_cli.py +0 -0
  430. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_commands/test_command_flows.py +0 -0
  431. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_commands/test_registry.py +0 -0
  432. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_config/__init__.py +0 -0
  433. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_config/test_paths.py +0 -0
  434. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_config/test_settings.py +0 -0
  435. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_coordinator/test_agent_definitions.py +0 -0
  436. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_coordinator/test_coordinator_mode.py +0 -0
  437. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_engine/__init__.py +0 -0
  438. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_engine/test_media_block.py +0 -0
  439. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_engine/test_query_engine.py +0 -0
  440. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_engine/test_tool_result_media.py +0 -0
  441. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_hooks/__init__.py +0 -0
  442. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_hooks/test_executor.py +0 -0
  443. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_hooks/test_loader_permissions.py +0 -0
  444. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_hooks_skills_plugins_real.py +0 -0
  445. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_mcp/__init__.py +0 -0
  446. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_mcp/test_config_permissions.py +0 -0
  447. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_mcp/test_integration.py +0 -0
  448. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_mcp/test_stdio_flow.py +0 -0
  449. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_memory/__init__.py +0 -0
  450. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_memory/test_manager_permissions.py +0 -0
  451. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_memory/test_memdir.py +0 -0
  452. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_merged_prs_on_autoagent.py +0 -0
  453. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_permissions/__init__.py +0 -0
  454. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_permissions/test_checker.py +0 -0
  455. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_permissions/test_loader.py +0 -0
  456. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_permissions/test_project_permissions.py +0 -0
  457. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_platforms.py +0 -0
  458. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_plugins/__init__.py +0 -0
  459. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_plugins/test_lifecycle_flow.py +0 -0
  460. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_plugins/test_loader.py +0 -0
  461. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_plugins/test_loader_permissions.py +0 -0
  462. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_prompts/__init__.py +0 -0
  463. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_prompts/test_claudemd.py +0 -0
  464. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_prompts/test_claudemd_permissions.py +0 -0
  465. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_prompts/test_environment.py +0 -0
  466. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_prompts/test_system_prompt.py +0 -0
  467. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_qq_channel.py +0 -0
  468. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_real_large_tasks.py +0 -0
  469. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_sandbox/test_adapter.py +0 -0
  470. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_sandbox/test_config_schema.py +0 -0
  471. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_sandbox/test_platform_linux.py +0 -0
  472. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_sandbox/test_platform_macos.py +0 -0
  473. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_sandbox/test_platform_windows.py +0 -0
  474. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_sandbox/test_proxy_env_vars.py +0 -0
  475. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_sandbox/test_runtime.py +0 -0
  476. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_sandbox/test_symlink_protection.py +0 -0
  477. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_sandbox/test_utils.py +0 -0
  478. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_sandbox/test_violation_store.py +0 -0
  479. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_scripts/test_sync_version.py +0 -0
  480. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_services/test_compact.py +0 -0
  481. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_services/test_cron.py +0 -0
  482. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_services/test_cron_scheduler.py +0 -0
  483. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_services/test_session_storage.py +0 -0
  484. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_skills/test_loader.py +0 -0
  485. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_skills/test_loader_permissions.py +0 -0
  486. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_swarm/__init__.py +0 -0
  487. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_swarm/test_agent_executor.py +0 -0
  488. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_swarm/test_imports.py +0 -0
  489. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_swarm/test_in_process.py +0 -0
  490. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_swarm/test_types.py +0 -0
  491. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_swarm/test_worktree.py +0 -0
  492. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_tasks/test_manager.py +0 -0
  493. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_tools/__init__.py +0 -0
  494. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_tools/test_agent_tool.py +0 -0
  495. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_tools/test_core_tools.py +0 -0
  496. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_tools/test_file_read_media.py +0 -0
  497. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_tools/test_glob_tool.py +0 -0
  498. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_tools/test_grep_tool.py +0 -0
  499. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_tools/test_integration.py +0 -0
  500. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_tools/test_integration_flows.py +0 -0
  501. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_tools/test_mcp_auth_tool.py +0 -0
  502. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_tools/test_ripgrep.py +0 -0
  503. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_tools/test_shell_common.py +0 -0
  504. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_tools/test_task_tools.py +0 -0
  505. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_tools/test_team_tools.py +0 -0
  506. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_tools/test_web_fetch_tool.py +0 -0
  507. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_ui/__init__.py +0 -0
  508. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_ui/test_modes.py +0 -0
  509. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_ui/test_permission_store.py +0 -0
  510. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_ui/test_react_backend.py +0 -0
  511. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_ui/test_react_launcher.py +0 -0
  512. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_ui/test_textual_app.py +0 -0
  513. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_untested_features.py +0 -0
  514. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/test_utils/test_shell.py +0 -0
  515. {illusion_code-0.2.3 → illusion_code-0.2.4}/tests/ui/test_backend_host.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: illusion-code
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: Open-source Python port of Claude Code - an AI-powered CLI coding assistant
5
5
  Project-URL: Homepage, https://github.com/YunTaiHua/illusion-code
6
6
  Project-URL: Repository, https://github.com/YunTaiHua/illusion-code
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@illusion/terminal",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@illusion/terminal",
9
- "version": "0.2.3",
9
+ "version": "0.2.4",
10
10
  "dependencies": {
11
11
  "chalk": "^5.6.2",
12
12
  "ink": "^5.1.0",
@@ -24,5 +24,5 @@
24
24
  "tsx": "^4.19.2",
25
25
  "typescript": "^5.7.3"
26
26
  },
27
- "version": "0.2.3"
27
+ "version": "0.2.4"
28
28
  }
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  /** 当前版本号 */
9
- export const VERSION = '0.2.3';
9
+ export const VERSION = '0.2.4';
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@illusion/web",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@illusion/web",
9
- "version": "0.2.3",
9
+ "version": "0.2.4",
10
10
  "dependencies": {
11
11
  "highlight.js": "^11.11.0",
12
12
  "react": "^18.3.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@illusion/web",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "scripts": {
@@ -28,6 +28,9 @@ const WS_URL = `ws://${window.location.host}/ws`;
28
28
  /** Toast 通知显示时长(毫秒) */
29
29
  const TOAST_DURATION = 5000;
30
30
 
31
+ /** B 通道允许的指令集合(前端识别并走 web_query) */
32
+ const B_COMMANDS = ['rewind', 'compact', 'context', 'export', 'init', 'fast', 'passes', 'turns', 'output-style', 'language'];
33
+
31
34
  /**
32
35
  * 应用主组件
33
36
  *
@@ -86,6 +89,24 @@ export default function App() {
86
89
  return () => { session.setOnSelectRequest(null); session.setOnCommandResult(null); };
87
90
  }, [session.setOnSelectRequest, session.setOnCommandResult, showToast]);
88
91
 
92
+ // 事件驱动删除:新建会话完成后(restoringSessionId 从非 null 变为 null),
93
+ // 如果有待删除的会话 ID,立即发送删除请求
94
+ const prevRestoringRef = useRef<string | null>(null);
95
+ useEffect(() => {
96
+ if (prevRestoringRef.current !== null && session.restoringSessionId === null) {
97
+ if (pendingDeleteIdsRef.current) {
98
+ const ids = pendingDeleteIdsRef.current;
99
+ pendingDeleteIdsRef.current = null;
100
+ if (ids.length === 1 && ids[0] === '__all__') {
101
+ session.sendRequest({ type: 'web_delete_sessions', delete_all: true });
102
+ } else {
103
+ session.sendRequest({ type: 'web_delete_sessions', session_ids: ids });
104
+ }
105
+ }
106
+ }
107
+ prevRestoringRef.current = session.restoringSessionId;
108
+ }, [session.restoringSessionId, session.sendRequest]);
109
+
89
110
  /**
90
111
  * 处理面板大小调整开始
91
112
  *
@@ -114,13 +135,16 @@ export default function App() {
114
135
  }, [sidebarWidth, rightPanelWidth]);
115
136
 
116
137
  /**
117
- * 处理用户提交的命令
138
+ * 处理用户提交的命令(三通道有序判定)
139
+ *
140
+ * 通道隔离原则:
141
+ * - B 通道(web_query):输入框识别的精细化指令(rewind/compact/context/export/init/
142
+ * fast/passes/turns/output-style/language),走 web_query 结构化处理。
143
+ * - 文本通道(submit_line):普通文本,或未被识别的斜杠指令(A 类如 /resume /model
144
+ * 以及已删除指令),全部当普通文本发给 LLM。
118
145
  *
119
- * 根据命令类型进行不同处理:
120
- * - /language: 前端本地构建语言选择选项
121
- * - /resume: 发送 list_sessions 请求
122
- * - /context, /rewind, /model, /delete: 通过 select_command 获取内联选项
123
- * - 其他命令: 直接提交到后端
146
+ * A 类指令(new/resume/delete/model/effort/permissions/plan)已完全交由 UI 控件承载,
147
+ * 输入框不识别,落入文本通道。
124
148
  *
125
149
  * @param line - 用户输入的命令
126
150
  */
@@ -128,38 +152,54 @@ export default function App() {
128
152
  if (!line.trim()) return;
129
153
  const trimmed = line.trim();
130
154
 
131
- // /language前端本地构建选项
132
- if (trimmed === '/language' || trimmed === '/language show') {
133
- const current = normalizeLanguage(session.status?.ui_language);
134
- setInlineOptions({
135
- command: 'language',
136
- title: t(lang, 'language'),
137
- options: [
138
- { value: 'set zh-CN', label: '简体中文', description: '中文界面', active: current === 'zh-CN' },
139
- { value: 'set en', label: 'English', description: 'English UI', active: current === 'en' },
140
- ],
141
- });
142
- return;
143
- }
144
-
145
- // /resume → 发送 list_sessions(和 terminal 端一致)
146
- if (trimmed === '/resume') {
147
- session.sendRequest({ type: 'list_sessions' });
148
- return;
149
- }
155
+ // 通道 1:B 类斜杠指令 web_query(精细化处理,不经过命令注册表)
156
+ if (trimmed.startsWith('/')) {
157
+ const cmdName = trimmed.slice(1).split(/\s+/)[0] ?? '';
158
+ const args = trimmed.slice(1 + cmdName.length).trim();
159
+
160
+ // /language(无参数)→ 弹出语言选择框,不走 web_query
161
+ if (cmdName === 'language' && !args) {
162
+ const current = String(session.status?.ui_language ?? 'zh-CN');
163
+ setInlineOptions({
164
+ command: 'language',
165
+ title: t(lang, 'language'),
166
+ options: [
167
+ { value: 'set zh-CN', label: '简体中文', description: '中文界面', active: current === 'zh-CN' },
168
+ { value: 'set en', label: 'English', description: 'English UI', active: current === 'en' },
169
+ ],
170
+ });
171
+ return;
172
+ }
173
+ // /fast(无参数)→ 弹出开关选择框,不走 web_query
174
+ if (cmdName === 'fast' && !args) {
175
+ const currentFast = Boolean(session.status?.fast_mode);
176
+ setInlineOptions({
177
+ command: 'fast',
178
+ title: t(lang, 'fast'),
179
+ options: [
180
+ { value: 'on', label: t(lang, 'fast_on'), description: t(lang, 'fast_on_desc'), active: currentFast },
181
+ { value: 'off', label: t(lang, 'fast_off'), description: t(lang, 'fast_off_desc'), active: !currentFast },
182
+ ],
183
+ });
184
+ return;
185
+ }
150
186
 
151
- // 通过 select_command 获取内联选项的命令
152
- const selectCommands = ['context', 'rewind', 'model', 'delete', 'rules', 'skills'];
153
- const cmdName = trimmed.startsWith('/') ? (trimmed.slice(1).split(/\s+/)[0] ?? '') : '';
154
- if (cmdName && selectCommands.includes(cmdName)) {
155
- session.setBusyTrue();
156
- session.requestSelectCommand(cmdName);
157
- return;
187
+ if (B_COMMANDS.includes(cmdName)) {
188
+ session.setBusyTrue();
189
+ session.sendRequest({
190
+ type: 'web_query',
191
+ command: cmdName,
192
+ args,
193
+ request_id: `q-${Date.now()}`,
194
+ });
195
+ return;
196
+ }
158
197
  }
159
198
 
160
- // 其他所有命令(含 /effort)→ 直接提交,结果走 toast
199
+ // 通道 2:所有其他输入(含 /resume、/model 等非 B 类指令)→ 当 user 消息发给 LLM
200
+ // treat_as_text=true 告诉后端跳过命令注册表,直接当文本提交给 LLM
161
201
  session.setBusyTrue();
162
- session.sendRequest({ type: 'submit_line', line: trimmed });
202
+ session.sendRequest({ type: 'submit_line', line: trimmed, treat_as_text: true });
163
203
  };
164
204
 
165
205
  /**
@@ -172,7 +212,18 @@ export default function App() {
172
212
  */
173
213
  const handleInlineSelect = useCallback((command: string, value: string) => {
174
214
  setInlineOptions(null);
175
- session.sendRequest({ type: 'apply_select_command', command, value });
215
+ // language fast web_query 通道(前端弹出选择框后提交)
216
+ if (command === 'language' || command === 'fast') {
217
+ session.sendRequest({
218
+ type: 'web_query',
219
+ command,
220
+ args: value,
221
+ request_id: `q-${Date.now()}`,
222
+ });
223
+ } else {
224
+ // rewind/context 等多步指令仍走 apply_select_command
225
+ session.sendRequest({ type: 'apply_select_command', command, value });
226
+ }
176
227
  }, [session.sendRequest]);
177
228
 
178
229
  /**
@@ -182,54 +233,64 @@ export default function App() {
182
233
  */
183
234
  const handleInlineClose = useCallback(() => setInlineOptions(null), []);
184
235
 
185
- // 删除会话弹窗状态
236
+ // 删除会话弹窗状态(本地控制,数据源来自 session.sessions 主列表)
186
237
  const [deleteSelected, setDeleteSelected] = useState<Set<string>>(new Set());
238
+ const [deleteModalOpen, setDeleteModalOpen] = useState(false);
239
+ // 待删除的会话 ID(事件驱动:先新建会话,等 web_restore_completed 后再删除)
240
+ const pendingDeleteIdsRef = useRef<string[] | null>(null);
187
241
 
188
242
  /** 处理停止当前任务 */
189
243
  const handleStop = () => { session.sendRequest({ type: 'stop' }); };
190
244
 
191
245
  /** 处理新建会话 */
192
246
  const handleNewSession = () => {
193
- session.sendRequest({ type: 'submit_line', line: '/new' });
247
+ session.sendRequest({ type: 'web_new_session' });
194
248
  };
195
249
 
196
250
  /**
197
- * 处理选择会话
251
+ * 处理选择会话(A 通道,零 suppress)
252
+ *
253
+ * 点击会话项 → 发送 web_restore_session,前端立即进入 restoring 态显示加载动画,
254
+ * 收到 web_restore_completed 后清除动画并替换转录。不再有 /resume 弹框副作用。
198
255
  *
199
256
  * @param id - 会话 ID
200
257
  */
201
258
  const handleSelectSession = useCallback((id: string) => {
202
- session.suppressInlineOptions();
203
- session.suppressCommandResult(1); // 抑制 apply_select_command 的命令结果
204
- session.suppressTranscript(); // 抑制转录事件,直到收到 replace_transcript
205
- session.sendRequest({ type: 'apply_select_command', command: 'resume', value: id });
206
- }, [session.suppressInlineOptions, session.suppressCommandResult, session.suppressTranscript, session.sendRequest]);
259
+ session.setRestoringSessionId(id);
260
+ session.sendRequest({ type: 'web_restore_session', session_id: id });
261
+ }, [session.setRestoringSessionId, session.sendRequest]);
207
262
 
208
- /** 处理列出会话 */
263
+ /** 处理列出会话(A 通道,后端推送 web_sessions) */
209
264
  const handleListSessions = useCallback(() => {
210
- session.suppressInlineOptions();
211
- session.suppressCommandResult();
212
- session.sendRequest({ type: 'list_sessions' });
213
- }, [session.suppressInlineOptions, session.suppressCommandResult, session.sendRequest]);
265
+ session.sendRequest({ type: 'web_request_sessions' });
266
+ }, [session.sendRequest]);
214
267
 
215
- /** 处理删除会话 */
268
+ /** 处理删除会话:打开删除弹窗(数据源来自 session.sessions 主列表) */
216
269
  const handleDeleteSessions = useCallback(() => {
217
- session.suppressInlineOptions();
218
- session.suppressCommandResult();
219
- session.requestSelectCommand('delete');
220
- }, [session.suppressInlineOptions, session.suppressCommandResult, session.requestSelectCommand]);
270
+ setDeleteSelected(new Set());
271
+ setDeleteModalOpen(true);
272
+ }, []);
221
273
  /**
222
274
  * 处理确认删除
223
275
  *
224
276
  * 删除所有选中的会话。
225
277
  */
226
278
  const handleConfirmDelete = useCallback(() => {
227
- session.suppressCommandResult();
228
- for (const id of deleteSelected) session.sendRequest({ type: 'apply_select_command', command: 'delete', value: id });
229
- session.clearDeleteSessions();
279
+ const ids = Array.from(deleteSelected);
280
+ if (ids.length > 0) {
281
+ const currentSessionId = String(session.status?.session_id ?? '');
282
+ const deletingCurrent = ids.includes(currentSessionId);
283
+ if (deletingCurrent) {
284
+ // 事件驱动:先新建会话,等 web_restore_completed 到达后再删除
285
+ pendingDeleteIdsRef.current = ids;
286
+ session.sendRequest({ type: 'web_new_session' });
287
+ } else {
288
+ session.sendRequest({ type: 'web_delete_sessions', session_ids: ids });
289
+ }
290
+ }
291
+ setDeleteModalOpen(false);
230
292
  setDeleteSelected(new Set());
231
- setTimeout(() => { session.suppressInlineOptions(); session.suppressCommandResult(); session.sendRequest({ type: 'list_sessions' }); }, 500);
232
- }, [deleteSelected, session.sendRequest, session.clearDeleteSessions, session.suppressInlineOptions, session.suppressCommandResult]);
293
+ }, [deleteSelected, session.sendRequest, session.status]);
233
294
 
234
295
  /**
235
296
  * 处理关闭删除模态框
@@ -237,9 +298,9 @@ export default function App() {
237
298
  * 关闭删除会话弹窗并清除选中状态。
238
299
  */
239
300
  const handleCloseDeleteModal = useCallback(() => {
240
- session.clearDeleteSessions();
301
+ setDeleteModalOpen(false);
241
302
  setDeleteSelected(new Set());
242
- }, [session.clearDeleteSessions]);
303
+ }, []);
243
304
 
244
305
  /**
245
306
  * 切换删除项选中状态
@@ -250,12 +311,12 @@ export default function App() {
250
311
  setDeleteSelected((prev) => { const n = new Set(prev); n.has(v) ? n.delete(v) : n.add(v); return n; });
251
312
  }, []);
252
313
 
253
- /** 是否显示删除模态框 */
254
- const showDeleteModal = session.deleteSessions.length > 0;
255
- /** 普通会话列表(排除 __all__ 选项) */
256
- const regularSessions = session.deleteSessions.filter((s) => s.value !== '__all__');
257
- /** 是否有全部删除选项 */
258
- const hasAllOption = session.deleteSessions.some((s) => s.value === '__all__');
314
+ /** 是否显示删除模态框(本地控制,不再依赖 select_request:delete 填充) */
315
+ const showDeleteModal = deleteModalOpen;
316
+ /** 待删除的普通会话列表(来自主会话列表 session.sessions) */
317
+ const regularSessions = session.sessions;
318
+ /** 总是提供"删除全部"入口 */
319
+ const hasAllOption = session.sessions.length > 0;
259
320
 
260
321
  /**
261
322
  * 处理权限响应
@@ -288,7 +349,7 @@ export default function App() {
288
349
  onListSessions={handleListSessions}
289
350
  onDeleteSessions={handleDeleteSessions}
290
351
  collapsed={sidebarCollapsed} onToggle={() => setSidebarCollapsed(!sidebarCollapsed)}
291
- width={sidebarWidth} />
352
+ width={sidebarWidth} restoringSessionId={session.restoringSessionId} />
292
353
  {!sidebarCollapsed && (
293
354
  <div className="w-1 cursor-col-resize hover:bg-primary/20 active:bg-primary/30 transition-colors shrink-0"
294
355
  onMouseDown={(e) => handleResizeStart('left', e)} />
@@ -301,16 +362,18 @@ export default function App() {
301
362
  streamingReasoning={session.streamingReasoning} pendingToolCalls={session.pendingToolCalls}
302
363
  busy={session.busy} connected={session.connected}
303
364
  modal={session.modal} onPermissionResponse={handlePermissionResponse}
304
- onQuestionResponse={handleQuestionResponse} />
365
+ onQuestionResponse={handleQuestionResponse} restoringSessionId={session.restoringSessionId} />
305
366
  <PromptInput lang={lang} busy={session.busy} connected={session.connected}
306
367
  commands={session.commands} onSubmit={handleSubmit} onStop={handleStop}
307
368
  inlineOptions={inlineOptions} onInlineSelect={handleInlineSelect} onInlineClose={handleInlineClose} />
308
369
  <Toolbar lang={lang} status={session.status}
309
- effortOptions={session.effortOptions} modelOptions={session.modelOptions}
310
- onModeChange={(v) => session.sendRequest({ type: 'submit_line', line: `/permissions set ${v}` })}
311
- onModelChange={session.setModelValue}
312
- onEffortChange={session.setEffortValue}
313
- onRequestModelList={() => session.requestSelectCommand('model')} />
370
+ modelOptions={session.modelOptions}
371
+ onSetSetting={(key, value) => {
372
+ if (key === 'model') session.setModelSwitching(true);
373
+ session.sendRequest({ type: 'web_set_setting', setting_key: key, setting_value: value });
374
+ }}
375
+ onRequestModels={() => session.sendRequest({ type: 'web_request_models' })}
376
+ modelSwitching={session.modelSwitching} />
314
377
  </div>
315
378
  {!rightPanelCollapsed && (
316
379
  <div className="w-1 cursor-col-resize hover:bg-primary/20 active:bg-primary/30 transition-colors shrink-0"
@@ -344,9 +407,10 @@ export default function App() {
344
407
  <div className="px-6 py-4 border-t border-border-light flex items-center justify-between">
345
408
  <div>{hasAllOption && (
346
409
  <button onClick={() => {
347
- session.sendRequest({ type: 'apply_select_command', command: 'delete', value: '__all__' });
348
- session.clearDeleteSessions(); setDeleteSelected(new Set());
349
- setTimeout(() => { session.suppressInlineOptions(); session.sendRequest({ type: 'list_sessions' }); }, 500);
410
+ // 事件驱动:先新建会话,等 web_restore_completed 到达后再删除全部
411
+ pendingDeleteIdsRef.current = ['__all__'];
412
+ session.sendRequest({ type: 'web_new_session' });
413
+ setDeleteModalOpen(false); setDeleteSelected(new Set());
350
414
  }} className="px-4 py-2 text-sm text-danger hover:bg-red-50 rounded-lg transition-colors cursor-pointer">{t(lang, 'delete_all')}</button>
351
415
  )}</div>
352
416
  <div className="flex gap-2">
@@ -58,6 +58,8 @@ interface ChatAreaProps {
58
58
  onPermissionResponse: (requestId: string, allowed: boolean, alwaysAllow: boolean, toolName: string) => void;
59
59
  /** 问答响应回调 */
60
60
  onQuestionResponse: (requestId: string, answer: string) => void;
61
+ /** 正在恢复的会话 ID(可选,非空时显示居中加载卡片覆盖转录区) */
62
+ restoringSessionId?: string | null;
61
63
  }
62
64
 
63
65
  /**
@@ -70,7 +72,7 @@ interface ChatAreaProps {
70
72
  */
71
73
  export default function ChatArea({
72
74
  lang, staticItems, assistantBuffer, streamingReasoning, pendingToolCalls, busy, connected,
73
- modal, onPermissionResponse, onQuestionResponse,
75
+ modal, onPermissionResponse, onQuestionResponse, restoringSessionId,
74
76
  }: ChatAreaProps) {
75
77
  const bottomRef = useRef<HTMLDivElement>(null);
76
78
 
@@ -78,9 +80,8 @@ export default function ChatArea({
78
80
  bottomRef.current?.scrollIntoView({ behavior: 'smooth' });
79
81
  }, [staticItems, assistantBuffer, streamingReasoning, pendingToolCalls, modal]);
80
82
 
81
- const hasContent = staticItems.length > 0 || assistantBuffer || streamingReasoning || pendingToolCalls.length > 0 || !!modal;
82
-
83
83
  // 按用户消息分组为轮次(turn),每轮以用户消息开头
84
+ // 注意:hooks 必须在任何条件返回之前调用(React Rules of Hooks)
84
85
  const turns = useMemo(() => {
85
86
  const result: TranscriptItem[][] = [];
86
87
  for (const item of staticItems) {
@@ -96,6 +97,24 @@ export default function ChatArea({
96
97
  // tool_use_id → tool_input 映射,用于 tool_result 摘要显示
97
98
  const toolInputMap = useMemo(() => buildToolInputMap(staticItems), [staticItems]);
98
99
 
100
+ const hasContent = staticItems.length > 0 || assistantBuffer || streamingReasoning || pendingToolCalls.length > 0 || !!modal;
101
+
102
+ // 会话恢复中:显示居中加载卡片,覆盖正常转录区
103
+ // 此条件返回在所有 hooks 之后,不违反 React Rules of Hooks
104
+ if (restoringSessionId) {
105
+ return (
106
+ <div className="flex-1 flex items-center justify-center bg-surface-main">
107
+ <div className="flex flex-col items-center gap-3">
108
+ <svg className="animate-spin w-8 h-8 text-primary" viewBox="0 0 24 24" fill="none">
109
+ <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" />
110
+ <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" />
111
+ </svg>
112
+ <span className="text-sm text-content-secondary">{t(lang, 'restoring_session')}</span>
113
+ </div>
114
+ </div>
115
+ );
116
+ }
117
+
99
118
  return (
100
119
  <div className="flex-1 overflow-y-auto bg-surface-main">
101
120
  {!connected && !hasContent && (
@@ -153,7 +172,7 @@ function ThinkingIndicator({ lang }: { lang: UiLanguage }) {
153
172
  <span className="w-1.5 h-1.5 rounded-full bg-primary animate-bounce" style={{ animationDelay: '300ms' }} />
154
173
  </span>
155
174
  <span className="text-xs text-content-secondary animate-pulse">
156
- {lang === 'zh-CN' ? '正在思考...' : 'Thinking...'}
175
+ {t(lang, 'thinking')}
157
176
  </span>
158
177
  </div>
159
178
  );
@@ -0,0 +1,103 @@
1
+ /**
2
+ * @fileoverview React 错误边界组件
3
+ *
4
+ * 捕获子组件树中的渲染错误,防止整个应用白屏崩溃。
5
+ * 显示友好的错误提示和重新加载按钮。
6
+ * 使用 navigator.language 做最佳努力的语言检测(class 组件无法用 hooks)。
7
+ *
8
+ * @module ErrorBoundary
9
+ */
10
+
11
+ import { Component, type ReactNode } from 'react';
12
+ import { normalizeLanguage } from '../i18n';
13
+
14
+ /** ErrorBoundary 专用的轻量 i18n(class 组件无法用 hooks,基于浏览器语言检测) */
15
+ const EB_TEXT: Record<string, { title: string; detail: string; retry: string; reload: string }> = {
16
+ 'zh-CN': { title: '页面渲染出错', detail: '发生了未知错误', retry: '重试', reload: '重新加载页面' },
17
+ 'en': { title: 'Rendering Error', detail: 'An unknown error occurred', retry: 'Retry', reload: 'Reload Page' },
18
+ };
19
+
20
+ function ebText(): { title: string; detail: string; retry: string; reload: string } {
21
+ const lang = normalizeLanguage(navigator.language);
22
+ return EB_TEXT[lang] ?? EB_TEXT['en']!;
23
+ }
24
+
25
+ /**
26
+ * ErrorBoundary 组件属性接口
27
+ */
28
+ interface ErrorBoundaryProps {
29
+ /** 子组件 */
30
+ children: ReactNode;
31
+ }
32
+
33
+ /**
34
+ * ErrorBoundary 组件状态接口
35
+ */
36
+ interface ErrorBoundaryState {
37
+ /** 是否有错误 */
38
+ hasError: boolean;
39
+ /** 错误信息 */
40
+ error: Error | null;
41
+ }
42
+
43
+ /**
44
+ * 错误边界组件
45
+ *
46
+ * 捕获子组件树中的渲染错误,显示友好的错误提示,
47
+ * 防止整个应用白屏崩溃。
48
+ */
49
+ export default class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
50
+ constructor(props: ErrorBoundaryProps) {
51
+ super(props);
52
+ this.state = { hasError: false, error: null };
53
+ }
54
+
55
+ static getDerivedStateFromError(error: Error): ErrorBoundaryState {
56
+ return { hasError: true, error };
57
+ }
58
+
59
+ componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {
60
+ console.error('[ErrorBoundary]', error, errorInfo);
61
+ }
62
+
63
+ handleReload = (): void => {
64
+ window.location.reload();
65
+ };
66
+
67
+ handleReset = (): void => {
68
+ this.setState({ hasError: false, error: null });
69
+ };
70
+
71
+ render(): ReactNode {
72
+ if (this.state.hasError) {
73
+ const t = ebText();
74
+ return (
75
+ <div className="flex items-center justify-center h-screen bg-surface-main">
76
+ <div className="text-center max-w-md px-6">
77
+ <div className="text-4xl mb-4">⚠️</div>
78
+ <h2 className="text-lg font-semibold text-content-primary mb-2">{t.title}</h2>
79
+ <p className="text-sm text-content-secondary mb-4">
80
+ {this.state.error?.message || t.detail}
81
+ </p>
82
+ <div className="flex gap-3 justify-center">
83
+ <button
84
+ onClick={this.handleReset}
85
+ className="px-4 py-2 text-sm text-content-secondary hover:bg-surface-hover rounded-lg transition-colors cursor-pointer border border-border-light"
86
+ >
87
+ {t.retry}
88
+ </button>
89
+ <button
90
+ onClick={this.handleReload}
91
+ className="px-4 py-2 text-sm text-white bg-primary hover:bg-primary-hover rounded-lg transition-colors cursor-pointer"
92
+ >
93
+ {t.reload}
94
+ </button>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ );
99
+ }
100
+
101
+ return this.props.children;
102
+ }
103
+ }
@@ -11,9 +11,20 @@
11
11
  * @module PromptInput
12
12
  */
13
13
 
14
- import { useCallback, useEffect, useRef, useState } from 'react';
14
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
15
15
  import { t, type UiLanguage } from '../i18n';
16
16
 
17
+ /**
18
+ * Web 端允许的 B 类指令集合(自动补全只显示这些)
19
+ *
20
+ * A 类指令(new/resume/delete/model/effort/permissions/plan)已完全交由 UI 控件承载,
21
+ * 输入框不识别;其余指令当作普通文本发给 LLM。因此自动补全只列出 B 类 10 个指令。
22
+ */
23
+ const WEB_COMMANDS = [
24
+ '/rewind', '/compact', '/context', '/export', '/init',
25
+ '/fast', '/passes', '/turns', '/output-style', '/language',
26
+ ];
27
+
17
28
  /**
18
29
  * 内联选项接口
19
30
  */
@@ -78,7 +89,14 @@ export default function PromptInput({ lang, busy, connected, commands, onSubmit,
78
89
  const [selectedIndex, setSelectedIndex] = useState(0);
79
90
  const listRef = useRef<HTMLDivElement>(null);
80
91
 
81
- const filteredCommands = commands.filter((cmd) => {
92
+ // 自动补全仅显示 B 类指令(与后端 ready 推送的完整命令列表取交集,无交集则用静态集合)
93
+ const webCommands = useMemo(() => {
94
+ return commands.length > 0
95
+ ? WEB_COMMANDS.filter((c) => commands.some((cmd) => cmd === c || cmd === c.slice(1)))
96
+ : WEB_COMMANDS;
97
+ }, [commands]);
98
+
99
+ const filteredCommands = webCommands.filter((cmd) => {
82
100
  const query = value.toLowerCase();
83
101
  return cmd.toLowerCase().startsWith(query) || cmd.toLowerCase().includes(query.slice(1));
84
102
  });
@@ -182,6 +200,7 @@ export default function PromptInput({ lang, busy, connected, commands, onSubmit,
182
200
  const line = value.trim();
183
201
  if (!line) return;
184
202
  onSubmit(line);
203
+ // 始终清空输入框(包括 B 指令触发 inline popup 的情况)
185
204
  setValue('');
186
205
  setShowCommands(false);
187
206
  }
@@ -38,6 +38,8 @@ interface SidebarProps {
38
38
  onToggle: () => void;
39
39
  /** 侧边栏宽度(可选,默认 280) */
40
40
  width?: number;
41
+ /** 正在恢复的会话 ID(可选,用于在对应会话项显示加载 spinner) */
42
+ restoringSessionId?: string | null;
41
43
  }
42
44
 
43
45
  /**
@@ -49,7 +51,7 @@ interface SidebarProps {
49
51
  * @returns 返回侧边栏的 JSX 元素
50
52
  */
51
53
  export default function Sidebar({
52
- lang, connected, sessions, onNewSession, onSelectSession, onListSessions, onDeleteSessions, collapsed, onToggle, width = 280,
54
+ lang, connected, sessions, onNewSession, onSelectSession, onListSessions, onDeleteSessions, collapsed, onToggle, width = 280, restoringSessionId,
53
55
  }: SidebarProps) {
54
56
  const [menuOpen, setMenuOpen] = useState(false);
55
57
 
@@ -59,7 +61,7 @@ export default function Sidebar({
59
61
  <button
60
62
  onClick={onToggle}
61
63
  className="w-9 h-9 flex items-center justify-center rounded-lg text-content-secondary hover:bg-surface-hover hover:text-content-primary transition-colors cursor-pointer"
62
- title="展开侧边栏"
64
+ title={t(lang, 'expand_panel')}
63
65
  >
64
66
  <svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round">
65
67
  <path d="M6 3l5 5-5 5" />
@@ -75,7 +77,7 @@ export default function Sidebar({
75
77
  <button
76
78
  onClick={onToggle}
77
79
  className="w-8 h-8 flex items-center justify-center rounded-lg text-content-secondary hover:text-content-primary hover:bg-surface-hover transition-colors cursor-pointer"
78
- title="收起侧边栏"
80
+ title={t(lang, 'collapse_panel')}
79
81
  >
80
82
  <svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round">
81
83
  <path d="M10 3l-5 5 5 5" />
@@ -128,10 +130,16 @@ export default function Sidebar({
128
130
  <button
129
131
  key={s.value}
130
132
  onClick={() => onSelectSession(s.value)}
131
- className="w-full text-left px-3 py-2 rounded-lg text-sm text-content-secondary hover:bg-surface-card-alt hover:text-content-primary transition-colors cursor-pointer"
133
+ className="w-full text-left px-3 py-2 rounded-lg text-sm text-content-secondary hover:bg-surface-card-alt hover:text-content-primary transition-colors cursor-pointer flex items-center gap-2"
132
134
  title={s.label}
133
135
  >
134
- <span className="line-clamp-2 leading-relaxed">{s.label}</span>
136
+ {restoringSessionId === s.value && (
137
+ <svg className="animate-spin w-3.5 h-3.5 text-primary shrink-0" viewBox="0 0 24 24" fill="none">
138
+ <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" />
139
+ <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" />
140
+ </svg>
141
+ )}
142
+ <span className="line-clamp-2 leading-relaxed flex-1">{s.label}</span>
135
143
  </button>
136
144
  ))}
137
145
  </div>