illusion-code 0.2.2__tar.gz → 0.2.3__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 (512) hide show
  1. {illusion_code-0.2.2 → illusion_code-0.2.3}/PKG-INFO +1 -1
  2. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/en/settings.md +26 -0
  3. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/zh-CN/settings.md +26 -0
  4. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/package-lock.json +2 -2
  5. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/package.json +1 -1
  6. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/version.ts +1 -1
  7. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/package-lock.json +2 -2
  8. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/package.json +1 -1
  9. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/App.tsx +14 -10
  10. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/components/MessageBubble.tsx +17 -7
  11. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/components/PromptInput.tsx +3 -3
  12. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/components/RightPanel.tsx +2 -2
  13. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/components/Sidebar.tsx +3 -3
  14. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/components/Toolbar.tsx +3 -3
  15. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/hooks/useWebSocketSession.ts +41 -6
  16. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/index.css +176 -71
  17. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/version.ts +1 -1
  18. illusion_code-0.2.3/frontend/web/tailwind.config.js +88 -0
  19. {illusion_code-0.2.2 → illusion_code-0.2.3}/pyproject.toml +1 -1
  20. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/__init__.py +1 -1
  21. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/cli.py +32 -2
  22. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/config/i18n.py +1 -0
  23. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/config/settings.py +1 -0
  24. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/ui/web/ws_host.py +86 -4
  25. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/feishu/test_adapter.py +1 -8
  26. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_hooks/test_loader_permissions.py +0 -1
  27. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_mcp/test_config_permissions.py +0 -1
  28. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_permissions/test_loader.py +0 -2
  29. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_permissions/test_project_permissions.py +0 -1
  30. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_plugins/test_loader_permissions.py +0 -1
  31. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_prompts/test_claudemd_permissions.py +0 -1
  32. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_qq_channel.py +1 -1
  33. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_sandbox/test_adapter.py +2 -3
  34. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_sandbox/test_config_schema.py +0 -1
  35. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_sandbox/test_platform_linux.py +0 -1
  36. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_sandbox/test_platform_macos.py +0 -1
  37. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_sandbox/test_proxy_env_vars.py +0 -1
  38. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_sandbox/test_runtime.py +0 -2
  39. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_sandbox/test_symlink_protection.py +0 -1
  40. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_sandbox/test_utils.py +0 -1
  41. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_sandbox/test_violation_store.py +0 -1
  42. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_skills/test_loader_permissions.py +0 -1
  43. illusion_code-0.2.2/frontend/web/tailwind.config.js +0 -76
  44. {illusion_code-0.2.2 → illusion_code-0.2.3}/.github/workflows/publish.yml +0 -0
  45. {illusion_code-0.2.2 → illusion_code-0.2.3}/.gitignore +0 -0
  46. {illusion_code-0.2.2 → illusion_code-0.2.3}/.python-version +0 -0
  47. {illusion_code-0.2.2 → illusion_code-0.2.3}/LICENSE +0 -0
  48. {illusion_code-0.2.2 → illusion_code-0.2.3}/README.md +0 -0
  49. {illusion_code-0.2.2 → illusion_code-0.2.3}/README.zh-CN.md +0 -0
  50. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/en/architecture.md +0 -0
  51. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/en/channels.md +0 -0
  52. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/en/commands.md +0 -0
  53. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/en/extensions.md +0 -0
  54. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/en/getting-started.md +0 -0
  55. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/en/introduction.md +0 -0
  56. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/en/project-files.md +0 -0
  57. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/images/IllusionCode.png +0 -0
  58. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/images/image1.png +0 -0
  59. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/images/image2.png +0 -0
  60. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/zh-CN/architecture.md +0 -0
  61. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/zh-CN/channels.md +0 -0
  62. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/zh-CN/commands.md +0 -0
  63. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/zh-CN/extensions.md +0 -0
  64. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/zh-CN/getting-started.md +0 -0
  65. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/zh-CN/introduction.md +0 -0
  66. {illusion_code-0.2.2 → illusion_code-0.2.3}/docs/zh-CN/project-files.md +0 -0
  67. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/build.mjs +0 -0
  68. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/App.tsx +0 -0
  69. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/CommandPicker.tsx +0 -0
  70. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/Composer.tsx +0 -0
  71. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/ComposerController.tsx +0 -0
  72. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/ConversationView.tsx +0 -0
  73. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/Footer.tsx +0 -0
  74. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/MarkdownContent.tsx +0 -0
  75. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/MarkdownTable.tsx +0 -0
  76. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/ModalHost.tsx +0 -0
  77. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/MultilineTextInput.tsx +0 -0
  78. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/PromptInput.tsx +0 -0
  79. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/SelectModal.tsx +0 -0
  80. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/SidePanel.tsx +0 -0
  81. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/Spinner.tsx +0 -0
  82. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/StatusBar.tsx +0 -0
  83. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/SwarmPanel.tsx +0 -0
  84. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/TodoPanel.tsx +0 -0
  85. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/ToolCallDisplay.tsx +0 -0
  86. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/TranscriptPane.tsx +0 -0
  87. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/components/WelcomeBanner.tsx +0 -0
  88. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/hooks/useAnimationFrame.ts +0 -0
  89. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/hooks/useBackendSession.ts +0 -0
  90. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/hooks/useBlink.ts +0 -0
  91. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/hooks/useTerminalSize.ts +0 -0
  92. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/i18n.ts +0 -0
  93. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/index.tsx +0 -0
  94. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/theme/ThemeContext.tsx +0 -0
  95. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/theme/builtinThemes.ts +0 -0
  96. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/ToolInterface.ts +0 -0
  97. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/AgentTool.ts +0 -0
  98. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/BashTool.ts +0 -0
  99. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/CronTool.ts +0 -0
  100. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/EditTool.ts +0 -0
  101. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/GenericTool.ts +0 -0
  102. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/LspTool.ts +0 -0
  103. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/McpTool.ts +0 -0
  104. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/NotebookTool.ts +0 -0
  105. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/PlanTool.ts +0 -0
  106. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/ReadTool.ts +0 -0
  107. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/SearchTool.ts +0 -0
  108. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/SkillTool.ts +0 -0
  109. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/TaskTool.ts +0 -0
  110. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/WebTool.ts +0 -0
  111. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/WorktreeTool.ts +0 -0
  112. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/implementations/WriteTool.ts +0 -0
  113. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/tools/registry.ts +0 -0
  114. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/types.ts +0 -0
  115. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/utils/markdown.ts +0 -0
  116. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/src/utils/thinking.ts +0 -0
  117. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/terminal/tsconfig.json +0 -0
  118. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/index.html +0 -0
  119. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/postcss.config.js +0 -0
  120. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/components/ChatArea.tsx +0 -0
  121. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/components/ModalCard.tsx +0 -0
  122. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/components/TodoPanel.tsx +0 -0
  123. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/components/WelcomeScreen.tsx +0 -0
  124. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/i18n.ts +0 -0
  125. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/main.tsx +0 -0
  126. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/remarkSuperscript.ts +0 -0
  127. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/types/protocol.ts +0 -0
  128. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/src/vite-env.d.ts +0 -0
  129. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/tsconfig.json +0 -0
  130. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/tsconfig.node.json +0 -0
  131. {illusion_code-0.2.2 → illusion_code-0.2.3}/frontend/web/vite.config.ts +0 -0
  132. {illusion_code-0.2.2 → illusion_code-0.2.3}/scripts/build_frontend.py +0 -0
  133. {illusion_code-0.2.2 → illusion_code-0.2.3}/scripts/hatch_build.py +0 -0
  134. {illusion_code-0.2.2 → illusion_code-0.2.3}/scripts/publish.py +0 -0
  135. {illusion_code-0.2.2 → illusion_code-0.2.3}/scripts/sync_version.py +0 -0
  136. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/__main__.py +0 -0
  137. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/api/__init__.py +0 -0
  138. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/api/client.py +0 -0
  139. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/api/codex_client.py +0 -0
  140. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/api/compat.py +0 -0
  141. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/api/effort.py +0 -0
  142. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/api/errors.py +0 -0
  143. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/api/openai_client.py +0 -0
  144. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/api/provider.py +0 -0
  145. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/api/registry.py +0 -0
  146. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/api/usage.py +0 -0
  147. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/auth/__init__.py +0 -0
  148. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/auth/codex_oauth.py +0 -0
  149. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/auth/copilot.py +0 -0
  150. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/auth/external.py +0 -0
  151. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/auth/flows.py +0 -0
  152. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/auth/manager.py +0 -0
  153. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/auth/storage.py +0 -0
  154. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/bridge/__init__.py +0 -0
  155. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/bridge/manager.py +0 -0
  156. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/bridge/session_runner.py +0 -0
  157. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/bridge/types.py +0 -0
  158. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/bridge/work_secret.py +0 -0
  159. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/__init__.py +0 -0
  160. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/base.py +0 -0
  161. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/base_commands.py +0 -0
  162. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/config.py +0 -0
  163. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/feishu/__init__.py +0 -0
  164. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/feishu/adapter.py +0 -0
  165. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/feishu/commands.py +0 -0
  166. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/feishu/messaging.py +0 -0
  167. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/feishu/session_map.py +0 -0
  168. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/feishu/ws_client.py +0 -0
  169. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/pid.py +0 -0
  170. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/qq/__init__.py +0 -0
  171. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/qq/adapter.py +0 -0
  172. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/qq/api.py +0 -0
  173. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/qq/commands.py +0 -0
  174. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/qq/session_map.py +0 -0
  175. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/qq/ws_client.py +0 -0
  176. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/serve.py +0 -0
  177. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/tools/__init__.py +0 -0
  178. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/tools/feishu_doc.py +0 -0
  179. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/tools/feishu_drive.py +0 -0
  180. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/weixin/__init__.py +0 -0
  181. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/weixin/adapter.py +0 -0
  182. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/weixin/commands.py +0 -0
  183. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/weixin/ilink_api.py +0 -0
  184. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/channels/weixin/session_map.py +0 -0
  185. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/__init__.py +0 -0
  186. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/auth.py +0 -0
  187. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/bridge.py +0 -0
  188. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/context.py +0 -0
  189. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/git.py +0 -0
  190. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/helpers.py +0 -0
  191. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/__init__.py +0 -0
  192. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/analysis/__init__.py +0 -0
  193. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/analysis/architecture.py +0 -0
  194. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/analysis/conventions.py +0 -0
  195. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/analysis/dependencies.py +0 -0
  196. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/analysis/key_modules.py +0 -0
  197. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/extraction/__init__.py +0 -0
  198. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/extraction/lsp_symbols.py +0 -0
  199. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/extraction/readme.py +0 -0
  200. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/extraction/scanner.py +0 -0
  201. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/generation/__init__.py +0 -0
  202. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/generation/claudemd.py +0 -0
  203. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/generation/illusionmd.py +0 -0
  204. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/generation/memory_template.py +0 -0
  205. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/generation/rules.py +0 -0
  206. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/generation/sections.py +0 -0
  207. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/orchestrator.py +0 -0
  208. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/init/types.py +0 -0
  209. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/mcp.py +0 -0
  210. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/memory.py +0 -0
  211. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/misc.py +0 -0
  212. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/model.py +0 -0
  213. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/plugin.py +0 -0
  214. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/registry.py +0 -0
  215. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/rules.py +0 -0
  216. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/sandbox.py +0 -0
  217. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/session.py +0 -0
  218. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/settings.py +0 -0
  219. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/commands/types.py +0 -0
  220. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/config/__init__.py +0 -0
  221. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/config/paths.py +0 -0
  222. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/config/plan_file.py +0 -0
  223. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/coordinator/__init__.py +0 -0
  224. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/coordinator/agent_definitions.py +0 -0
  225. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/coordinator/coordinator_mode.py +0 -0
  226. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/engine/__init__.py +0 -0
  227. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/engine/cost_tracker.py +0 -0
  228. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/engine/messages.py +0 -0
  229. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/engine/query.py +0 -0
  230. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/engine/query_engine.py +0 -0
  231. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/engine/stream_events.py +0 -0
  232. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/hooks/__init__.py +0 -0
  233. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/hooks/events.py +0 -0
  234. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/hooks/executor.py +0 -0
  235. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/hooks/hot_reload.py +0 -0
  236. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/hooks/loader.py +0 -0
  237. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/hooks/register_hooks.py +0 -0
  238. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/hooks/schemas.py +0 -0
  239. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/hooks/session_hooks.py +0 -0
  240. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/hooks/types.py +0 -0
  241. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/hooks/utils.py +0 -0
  242. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/mcp/__init__.py +0 -0
  243. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/mcp/client.py +0 -0
  244. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/mcp/config.py +0 -0
  245. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/mcp/types.py +0 -0
  246. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/memory/__init__.py +0 -0
  247. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/memory/manager.py +0 -0
  248. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/memory/memdir.py +0 -0
  249. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/memory/paths.py +0 -0
  250. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/memory/scan.py +0 -0
  251. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/memory/search.py +0 -0
  252. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/memory/types.py +0 -0
  253. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/output_styles/__init__.py +0 -0
  254. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/output_styles/loader.py +0 -0
  255. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/permissions/__init__.py +0 -0
  256. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/permissions/checker.py +0 -0
  257. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/permissions/loader.py +0 -0
  258. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/permissions/modes.py +0 -0
  259. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/permissions/schemas.py +0 -0
  260. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/platforms.py +0 -0
  261. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/plugins/__init__.py +0 -0
  262. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/plugins/installer.py +0 -0
  263. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/plugins/loader.py +0 -0
  264. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/plugins/options.py +0 -0
  265. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/plugins/schemas.py +0 -0
  266. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/plugins/types.py +0 -0
  267. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/prompts/__init__.py +0 -0
  268. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/prompts/claudemd.py +0 -0
  269. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/prompts/context.py +0 -0
  270. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/prompts/environment.py +0 -0
  271. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/prompts/system_prompt.py +0 -0
  272. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/sandbox/__init__.py +0 -0
  273. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/sandbox/adapter.py +0 -0
  274. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/sandbox/platforms/__init__.py +0 -0
  275. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/sandbox/platforms/base.py +0 -0
  276. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/sandbox/platforms/linux.py +0 -0
  277. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/sandbox/platforms/macos.py +0 -0
  278. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/sandbox/platforms/windows.py +0 -0
  279. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/sandbox/proxy/__init__.py +0 -0
  280. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/sandbox/proxy/env_vars.py +0 -0
  281. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/sandbox/runtime.py +0 -0
  282. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/sandbox/symlink_protection.py +0 -0
  283. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/sandbox/utils.py +0 -0
  284. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/sandbox/violation_store.py +0 -0
  285. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/__init__.py +0 -0
  286. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/compact/__init__.py +0 -0
  287. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/compact/auto_compact.py +0 -0
  288. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/compact/compact_core.py +0 -0
  289. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/compact/compact_prompt.py +0 -0
  290. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/compact/constants.py +0 -0
  291. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/compact/message_ops.py +0 -0
  292. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/compact/microcompact.py +0 -0
  293. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/compact/models.py +0 -0
  294. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/compact/token_utils.py +0 -0
  295. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/cron.py +0 -0
  296. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/cron_scheduler.py +0 -0
  297. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/file_history.py +0 -0
  298. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/lsp/__init__.py +0 -0
  299. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/lsp/client.py +0 -0
  300. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/lsp/config.py +0 -0
  301. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/lsp/manager.py +0 -0
  302. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/lsp/types.py +0 -0
  303. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/session_storage.py +0 -0
  304. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/services/token_estimation.py +0 -0
  305. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/skills/__init__.py +0 -0
  306. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/skills/bundled/__init__.py +0 -0
  307. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/skills/bundled/content/batch.md +0 -0
  308. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/skills/bundled/content/debug.md +0 -0
  309. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/skills/bundled/content/loop.md +0 -0
  310. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/skills/bundled/content/remember.md +0 -0
  311. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/skills/bundled/content/simplify.md +0 -0
  312. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/skills/bundled/content/skillify.md +0 -0
  313. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/skills/bundled/content/stuck.md +0 -0
  314. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/skills/bundled/content/update-config.md +0 -0
  315. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/skills/bundled/content/verify.md +0 -0
  316. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/skills/loader.py +0 -0
  317. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/skills/registry.py +0 -0
  318. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/skills/types.py +0 -0
  319. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/state/__init__.py +0 -0
  320. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/state/app_state.py +0 -0
  321. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/state/store.py +0 -0
  322. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/swarm/__init__.py +0 -0
  323. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/swarm/agent_executor.py +0 -0
  324. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/swarm/in_process.py +0 -0
  325. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/swarm/subprocess_backend.py +0 -0
  326. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/swarm/team_helpers.py +0 -0
  327. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/swarm/types.py +0 -0
  328. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/swarm/worktree.py +0 -0
  329. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tasks/__init__.py +0 -0
  330. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tasks/local_agent_task.py +0 -0
  331. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tasks/local_shell_task.py +0 -0
  332. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tasks/manager.py +0 -0
  333. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tasks/stop_task.py +0 -0
  334. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tasks/types.py +0 -0
  335. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/__init__.py +0 -0
  336. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/agent_tool.py +0 -0
  337. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/ask_user_question_tool.py +0 -0
  338. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/base.py +0 -0
  339. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/bash_tool.py +0 -0
  340. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/config_tool.py +0 -0
  341. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/cron_tool.py +0 -0
  342. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/enter_plan_mode_tool.py +0 -0
  343. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/enter_worktree_tool.py +0 -0
  344. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/exit_plan_mode_tool.py +0 -0
  345. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/exit_worktree_tool.py +0 -0
  346. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/file_edit_tool.py +0 -0
  347. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/file_read_tool.py +0 -0
  348. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/file_write_tool.py +0 -0
  349. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/glob_tool.py +0 -0
  350. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/grep_tool.py +0 -0
  351. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/list_mcp_resources_tool.py +0 -0
  352. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/lsp_formatters.py +0 -0
  353. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/lsp_schemas.py +0 -0
  354. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/lsp_tool.py +0 -0
  355. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/mcp_auth_tool.py +0 -0
  356. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/mcp_tool.py +0 -0
  357. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/notebook_edit_tool.py +0 -0
  358. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/powershell_tool.py +0 -0
  359. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/read_mcp_resource_tool.py +0 -0
  360. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/repl_tool.py +0 -0
  361. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/send_message_tool.py +0 -0
  362. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/shell_common.py +0 -0
  363. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/skill_tool.py +0 -0
  364. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/sleep_tool.py +0 -0
  365. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/structured_output_tool.py +0 -0
  366. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/task_create_tool.py +0 -0
  367. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/task_get_tool.py +0 -0
  368. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/task_list_tool.py +0 -0
  369. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/task_output_tool.py +0 -0
  370. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/task_stop_tool.py +0 -0
  371. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/task_update_tool.py +0 -0
  372. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/team_create_tool.py +0 -0
  373. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/team_delete_tool.py +0 -0
  374. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/todo_write_tool.py +0 -0
  375. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/tool_search_tool.py +0 -0
  376. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/web_fetch_tool.py +0 -0
  377. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/tools/web_search_tool.py +0 -0
  378. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/ui/__init__.py +0 -0
  379. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/ui/app.py +0 -0
  380. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/ui/backend_host.py +0 -0
  381. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/ui/input.py +0 -0
  382. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/ui/output.py +0 -0
  383. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/ui/permission_dialog.py +0 -0
  384. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/ui/permission_store.py +0 -0
  385. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/ui/protocol.py +0 -0
  386. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/ui/react_launcher.py +0 -0
  387. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/ui/runtime.py +0 -0
  388. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/ui/textual_app.py +0 -0
  389. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/ui/web/__init__.py +0 -0
  390. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/ui/web/server.py +0 -0
  391. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/utils/__init__.py +0 -0
  392. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/utils/ripgrep.py +0 -0
  393. {illusion_code-0.2.2 → illusion_code-0.2.3}/src/illusion/utils/shell.py +0 -0
  394. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/__init__.py +0 -0
  395. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/api/test_anthropic_client.py +0 -0
  396. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/api/test_client.py +0 -0
  397. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/api/test_codex_client.py +0 -0
  398. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/api/test_effort.py +0 -0
  399. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/api/test_fallback/346/217/220/347/244/272.py" +0 -0
  400. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/api/test_openai_client.py +0 -0
  401. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/__init__.py +0 -0
  402. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/feishu/__init__.py +0 -0
  403. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/feishu/test_commands.py +0 -0
  404. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/feishu/test_session_map.py +0 -0
  405. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/test_base.py +0 -0
  406. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/test_base_commands.py +0 -0
  407. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/test_config.py +0 -0
  408. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/test_pid.py +0 -0
  409. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/test_tool_registration.py +0 -0
  410. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/tools/__init__.py +0 -0
  411. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/tools/test_feishu_doc.py +0 -0
  412. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/tools/test_feishu_drive.py +0 -0
  413. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/weixin/__init__.py +0 -0
  414. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/weixin/test_adapter.py +0 -0
  415. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/weixin/test_config.py +0 -0
  416. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/weixin/test_ilink_api.py +0 -0
  417. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/channels/weixin/test_session_map.py +0 -0
  418. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/commands/init/__init__.py +0 -0
  419. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/commands/init/test_claudemd.py +0 -0
  420. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/commands/init/test_orchestrator.py +0 -0
  421. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/commands/init/test_scanner.py +0 -0
  422. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/commands/init/test_sections.py +0 -0
  423. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/commands/test_effort_command.py +0 -0
  424. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/config/test_i18n.py +0 -0
  425. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/config/test_settings.py +0 -0
  426. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/conftest.py +0 -0
  427. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/engine/test_query_engine.py +0 -0
  428. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/fixtures/fake_mcp_server.py +0 -0
  429. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/integration/test_effort_integration.py +0 -0
  430. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/services/lsp/test_lsp_client.py +0 -0
  431. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/services/lsp/test_lsp_config.py +0 -0
  432. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/services/lsp/test_lsp_manager.py +0 -0
  433. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/services/lsp/test_lsp_types.py +0 -0
  434. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_api/__init__.py +0 -0
  435. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_api/test_client.py +0 -0
  436. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_api/test_codex_client.py +0 -0
  437. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_api/test_compat.py +0 -0
  438. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_api/test_openai_client.py +0 -0
  439. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_auth/test_external.py +0 -0
  440. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_bridge/test_core.py +0 -0
  441. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_bridge/test_session_flow.py +0 -0
  442. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_commands/__init__.py +0 -0
  443. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_commands/test_cli.py +0 -0
  444. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_commands/test_command_flows.py +0 -0
  445. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_commands/test_registry.py +0 -0
  446. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_config/__init__.py +0 -0
  447. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_config/test_paths.py +0 -0
  448. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_config/test_settings.py +0 -0
  449. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_coordinator/test_agent_definitions.py +0 -0
  450. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_coordinator/test_coordinator_mode.py +0 -0
  451. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_engine/__init__.py +0 -0
  452. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_engine/test_media_block.py +0 -0
  453. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_engine/test_query_engine.py +0 -0
  454. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_engine/test_tool_result_media.py +0 -0
  455. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_hooks/__init__.py +0 -0
  456. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_hooks/test_executor.py +0 -0
  457. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_hooks_skills_plugins_real.py +0 -0
  458. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_mcp/__init__.py +0 -0
  459. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_mcp/test_integration.py +0 -0
  460. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_mcp/test_stdio_flow.py +0 -0
  461. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_memory/__init__.py +0 -0
  462. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_memory/test_manager_permissions.py +0 -0
  463. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_memory/test_memdir.py +0 -0
  464. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_merged_prs_on_autoagent.py +0 -0
  465. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_permissions/__init__.py +0 -0
  466. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_permissions/test_checker.py +0 -0
  467. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_platforms.py +0 -0
  468. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_plugins/__init__.py +0 -0
  469. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_plugins/test_lifecycle_flow.py +0 -0
  470. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_plugins/test_loader.py +0 -0
  471. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_prompts/__init__.py +0 -0
  472. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_prompts/test_claudemd.py +0 -0
  473. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_prompts/test_environment.py +0 -0
  474. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_prompts/test_system_prompt.py +0 -0
  475. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_real_large_tasks.py +0 -0
  476. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_sandbox/test_platform_windows.py +0 -0
  477. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_scripts/test_sync_version.py +0 -0
  478. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_services/test_compact.py +0 -0
  479. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_services/test_cron.py +0 -0
  480. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_services/test_cron_scheduler.py +0 -0
  481. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_services/test_session_storage.py +0 -0
  482. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_skills/test_loader.py +0 -0
  483. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_swarm/__init__.py +0 -0
  484. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_swarm/test_agent_executor.py +0 -0
  485. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_swarm/test_imports.py +0 -0
  486. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_swarm/test_in_process.py +0 -0
  487. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_swarm/test_types.py +0 -0
  488. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_swarm/test_worktree.py +0 -0
  489. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_tasks/test_manager.py +0 -0
  490. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_tools/__init__.py +0 -0
  491. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_tools/test_agent_tool.py +0 -0
  492. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_tools/test_core_tools.py +0 -0
  493. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_tools/test_file_read_media.py +0 -0
  494. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_tools/test_glob_tool.py +0 -0
  495. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_tools/test_grep_tool.py +0 -0
  496. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_tools/test_integration.py +0 -0
  497. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_tools/test_integration_flows.py +0 -0
  498. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_tools/test_mcp_auth_tool.py +0 -0
  499. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_tools/test_ripgrep.py +0 -0
  500. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_tools/test_shell_common.py +0 -0
  501. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_tools/test_task_tools.py +0 -0
  502. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_tools/test_team_tools.py +0 -0
  503. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_tools/test_web_fetch_tool.py +0 -0
  504. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_ui/__init__.py +0 -0
  505. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_ui/test_modes.py +0 -0
  506. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_ui/test_permission_store.py +0 -0
  507. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_ui/test_react_backend.py +0 -0
  508. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_ui/test_react_launcher.py +0 -0
  509. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_ui/test_textual_app.py +0 -0
  510. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_untested_features.py +0 -0
  511. {illusion_code-0.2.2 → illusion_code-0.2.3}/tests/test_utils/test_shell.py +0 -0
  512. {illusion_code-0.2.2 → illusion_code-0.2.3}/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.2
3
+ Version: 0.2.3
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
@@ -5,6 +5,7 @@
5
5
  - [Configuration Overview](#configuration-overview)
6
6
  - [Credentials File (credentials.json)](#credentials-file-credentialsjson)
7
7
  - [Global Configuration (settings.json)](#global-configuration-settingsjson)
8
+ - [working_directory](#working_directory)
8
9
  - [Environment Configuration (EnvConfig)](#environment-configuration-envconfig)
9
10
  - [Provider Configuration Examples](#provider-configuration-examples)
10
11
  - [Permission Configuration](#permission-configuration)
@@ -142,6 +143,7 @@ Uses `env_N` grouped format. Each `env_N` is an independent environment config (
142
143
  },
143
144
  "enabled_plugins": {},
144
145
  "mcp_servers": {},
146
+ "working_directory": null,
145
147
  "ui_language": "en-US",
146
148
  "output_style": "default",
147
149
  "fast_mode": false,
@@ -166,6 +168,30 @@ Uses `env_N` grouped format. Each `env_N` is an independent environment config (
166
168
  | `effort` | string | "medium" | Reasoning effort: low/medium/high/xhigh/max |
167
169
  | `passes` | int | 1 | Reasoning passes (1-8) |
168
170
  | `verbose` | bool | false | Verbose output |
171
+ | `working_directory` | string | - | Fixed working directory (optional) |
172
+
173
+ ---
174
+
175
+ ## working_directory
176
+
177
+ Fixed working directory. If set, illusion-code will automatically switch to this directory on startup.
178
+
179
+ **Type:** String (optional)
180
+
181
+ **Default:** Not set or empty
182
+
183
+ **Example:**
184
+
185
+ ```json
186
+ {
187
+ "working_directory": "E:\\Projects\\my-project"
188
+ }
189
+ ```
190
+
191
+ **Behavior:**
192
+ - If the field exists and is not empty, automatically switches to the specified directory on startup
193
+ - If the field does not exist or is empty, uses the current directory at startup
194
+ - If the specified directory does not exist or lacks permissions, logs a warning and uses the current directory
169
195
 
170
196
  ---
171
197
 
@@ -5,6 +5,7 @@
5
5
  - [配置概览](#配置概览)
6
6
  - [凭据文件 (credentials.json)](#凭据文件-credentialsjson)
7
7
  - [全局配置 (settings.json)](#全局配置-settingsjson)
8
+ - [working_directory](#working_directory)
8
9
  - [环境配置 (EnvConfig)](#环境配置-envconfig)
9
10
  - [各提供商配置示例](#各提供商配置示例)
10
11
  - [权限配置](#权限配置)
@@ -142,6 +143,7 @@
142
143
  },
143
144
  "enabled_plugins": {},
144
145
  "mcp_servers": {},
146
+ "working_directory": null,
145
147
  "ui_language": "zh-CN",
146
148
  "output_style": "default",
147
149
  "fast_mode": false,
@@ -166,6 +168,30 @@
166
168
  | `effort` | string | "medium" | 推理强度:low/medium/high/xhigh/max |
167
169
  | `passes` | int | 1 | 推理轮数(1-8) |
168
170
  | `verbose` | bool | false | 详细输出 |
171
+ | `working_directory` | string | - | 固定工作目录(可选) |
172
+
173
+ ---
174
+
175
+ ## working_directory
176
+
177
+ 固定工作目录。如果设置此字段,illusion-code启动时会自动切换到该目录。
178
+
179
+ **类型:** 字符串(可选)
180
+
181
+ **默认值:** 不设置或为空
182
+
183
+ **示例:**
184
+
185
+ ```json
186
+ {
187
+ "working_directory": "E:\\Projects\\my-project"
188
+ }
189
+ ```
190
+
191
+ **行为:**
192
+ - 如果字段存在且不为空,启动时自动切换到指定目录
193
+ - 如果字段不存在或为空,使用启动时的当前目录
194
+ - 如果指定的目录不存在或无权限,记录警告日志,使用当前目录
169
195
 
170
196
  ---
171
197
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@illusion/terminal",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@illusion/terminal",
9
- "version": "0.2.2",
9
+ "version": "0.2.3",
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.2"
27
+ "version": "0.2.3"
28
28
  }
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  /** 当前版本号 */
9
- export const VERSION = '0.2.2';
9
+ export const VERSION = '0.2.3';
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@illusion/web",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@illusion/web",
9
- "version": "0.2.2",
9
+ "version": "0.2.3",
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.2",
3
+ "version": "0.2.3",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "scripts": {
@@ -149,7 +149,7 @@ export default function App() {
149
149
  }
150
150
 
151
151
  // 通过 select_command 获取内联选项的命令
152
- const selectCommands = ['context', 'rewind', 'model', 'delete'];
152
+ const selectCommands = ['context', 'rewind', 'model', 'delete', 'rules', 'skills'];
153
153
  const cmdName = trimmed.startsWith('/') ? (trimmed.slice(1).split(/\s+/)[0] ?? '') : '';
154
154
  if (cmdName && selectCommands.includes(cmdName)) {
155
155
  session.setBusyTrue();
@@ -198,34 +198,38 @@ export default function App() {
198
198
  *
199
199
  * @param id - 会话 ID
200
200
  */
201
- const handleSelectSession = (id: string) => {
201
+ const handleSelectSession = useCallback((id: string) => {
202
202
  session.suppressInlineOptions();
203
+ session.suppressCommandResult(1); // 抑制 apply_select_command 的命令结果
204
+ session.suppressTranscript(); // 抑制转录事件,直到收到 replace_transcript
203
205
  session.sendRequest({ type: 'apply_select_command', command: 'resume', value: id });
204
- setTimeout(() => { session.suppressInlineOptions(); session.sendRequest({ type: 'list_sessions' }); }, 500);
205
- };
206
+ }, [session.suppressInlineOptions, session.suppressCommandResult, session.suppressTranscript, session.sendRequest]);
206
207
 
207
208
  /** 处理列出会话 */
208
209
  const handleListSessions = useCallback(() => {
209
210
  session.suppressInlineOptions();
211
+ session.suppressCommandResult();
210
212
  session.sendRequest({ type: 'list_sessions' });
211
- }, [session.suppressInlineOptions, session.sendRequest]);
213
+ }, [session.suppressInlineOptions, session.suppressCommandResult, session.sendRequest]);
212
214
 
213
215
  /** 处理删除会话 */
214
216
  const handleDeleteSessions = useCallback(() => {
215
217
  session.suppressInlineOptions();
218
+ session.suppressCommandResult();
216
219
  session.requestSelectCommand('delete');
217
- }, [session.suppressInlineOptions, session.requestSelectCommand]);
220
+ }, [session.suppressInlineOptions, session.suppressCommandResult, session.requestSelectCommand]);
218
221
  /**
219
222
  * 处理确认删除
220
223
  *
221
224
  * 删除所有选中的会话。
222
225
  */
223
226
  const handleConfirmDelete = useCallback(() => {
227
+ session.suppressCommandResult();
224
228
  for (const id of deleteSelected) session.sendRequest({ type: 'apply_select_command', command: 'delete', value: id });
225
229
  session.clearDeleteSessions();
226
230
  setDeleteSelected(new Set());
227
- setTimeout(() => { session.suppressInlineOptions(); session.sendRequest({ type: 'list_sessions' }); }, 500);
228
- }, [deleteSelected, session.sendRequest, session.clearDeleteSessions, session.suppressInlineOptions]);
231
+ setTimeout(() => { session.suppressInlineOptions(); session.suppressCommandResult(); session.sendRequest({ type: 'list_sessions' }); }, 500);
232
+ }, [deleteSelected, session.sendRequest, session.clearDeleteSessions, session.suppressInlineOptions, session.suppressCommandResult]);
229
233
 
230
234
  /**
231
235
  * 处理关闭删除模态框
@@ -323,7 +327,7 @@ export default function App() {
323
327
  {showDeleteModal && (
324
328
  <div className="fixed inset-0 z-50 flex items-center justify-center">
325
329
  <div className="absolute inset-0 bg-black/30 backdrop-blur-sm" onClick={handleCloseDeleteModal} />
326
- <div className="relative bg-white rounded-2xl shadow-2xl border border-border-light w-[420px] max-h-[70vh] flex flex-col">
330
+ <div className="relative bg-white rounded-xl shadow-2xl border border-border-light w-[420px] max-h-[70vh] flex flex-col">
327
331
  <div className="px-6 py-4 border-b border-border-light">
328
332
  <h3 className="text-lg font-semibold text-content-primary">{t(lang, 'delete_session')}</h3>
329
333
  </div>
@@ -361,7 +365,7 @@ export default function App() {
361
365
  {toastMessage && (
362
366
  <div className="fixed bottom-20 right-6 z-50 animate-fade-in"
363
367
  onMouseEnter={handleToastMouseEnter} onMouseLeave={handleToastMouseLeave}>
364
- <div className="bg-white rounded-xl shadow-lg px-4 py-3 max-w-sm">
368
+ <div className="bg-white rounded-lg shadow-lg px-4 py-3 max-w-sm">
365
369
  <div className="flex items-start gap-3">
366
370
  <pre className="text-sm text-content-primary whitespace-pre-wrap font-mono leading-relaxed flex-1 max-h-40 overflow-y-auto">{toastMessage.text}</pre>
367
371
  <button onClick={() => setToastMessage(null)}
@@ -42,7 +42,7 @@ export default function MessageBubble({ item, toolInputMap }: MessageBubbleProps
42
42
  if (item.role === 'user') {
43
43
  return (
44
44
  <div className="flex justify-end py-1.5">
45
- <div className="max-w-[min(82%,64ch)] bg-[rgba(0,0,0,0.031)] border border-[#e5e5e5] rounded-[6px] px-3 py-2 text-sm text-content-primary whitespace-pre-wrap break-words select-text">
45
+ <div className="max-w-[min(82%,64ch)] bg-surface-card-alt border border-border-light rounded-lg px-3 py-2 text-sm text-content-primary whitespace-pre-wrap break-words select-text">
46
46
  {item.text}
47
47
  </div>
48
48
  </div>
@@ -107,7 +107,7 @@ function ToolResultBubble({ name, text, isError, toolInput }: { name: string; te
107
107
  </span>
108
108
  </button>
109
109
  {open && text && (
110
- <div className={`mt-1 ml-3.5 p-2.5 whitespace-pre-wrap font-mono text-xs leading-relaxed max-h-60 overflow-y-auto rounded-[6px] select-text ${isError ? 'text-danger bg-red-50 border border-red-200' : 'text-content-primary bg-[rgba(0,0,0,0.031)] border border-[#e5e5e5]'}`}>
110
+ <div className={`mt-1 ml-3.5 p-2.5 whitespace-pre-wrap font-mono text-xs leading-relaxed max-h-60 overflow-y-auto rounded-lg select-text ${isError ? 'text-danger bg-danger/5 border border-danger/20' : 'text-content-primary bg-surface-card-alt border border-border-light'}`}>
111
111
  {text}
112
112
  </div>
113
113
  )}
@@ -118,7 +118,9 @@ function ToolResultBubble({ name, text, isError, toolInput }: { name: string; te
118
118
  /**
119
119
  * 思考过程块组件
120
120
  *
121
- * 显示助手的思考/推理过程。
121
+ * 显示助手的思考/推理过程,支持 Markdown 渲染。
122
+ * 使用与主消息相同的渲染链(ReactMarkdown + remark-gfm + rehype-highlight),
123
+ * 但以更柔和的样式呈现,与正文形成视觉层次区分。
122
124
  *
123
125
  * @param props - 组件属性
124
126
  * @param props.text - 思考过程文本
@@ -126,8 +128,12 @@ function ToolResultBubble({ name, text, isError, toolInput }: { name: string; te
126
128
  function ThinkingBlock({ text }: { text: string }) {
127
129
  if (!text?.trim()) return null;
128
130
  return (
129
- <div className="text-sm text-content-secondary whitespace-pre-wrap leading-relaxed select-text mb-3 opacity-75">
130
- {text}
131
+ <div className="text-sm text-content-secondary leading-relaxed select-text mb-3 opacity-80 py-1">
132
+ <div className="prose prose-sm max-w-full">
133
+ <ReactMarkdown remarkPlugins={[remarkGfm, remarkSuperscript]} rehypePlugins={[rehypeHighlight, rehypeRaw]}>
134
+ {text}
135
+ </ReactMarkdown>
136
+ </div>
131
137
  </div>
132
138
  );
133
139
  }
@@ -249,8 +255,12 @@ export function StreamingBuffer({ text, reasoning }: { text: string; reasoning?:
249
255
  return (
250
256
  <div className="py-1.5">
251
257
  {hasReasoning && (
252
- <div className="text-sm text-content-secondary whitespace-pre-wrap leading-relaxed select-text mb-3 opacity-75">
253
- {reasoning}
258
+ <div className="text-sm text-content-secondary leading-relaxed select-text mb-3 opacity-80 py-1">
259
+ <div className="prose prose-sm max-w-full">
260
+ <ReactMarkdown remarkPlugins={[remarkGfm, remarkSuperscript]} rehypePlugins={[rehypeHighlight, rehypeRaw]}>
261
+ {reasoning}
262
+ </ReactMarkdown>
263
+ </div>
254
264
  {!hasText && <span className="inline-block w-0.5 h-4 bg-content-secondary animate-blink ml-0.5 align-middle" />}
255
265
  </div>
256
266
  )}
@@ -246,7 +246,7 @@ export default function PromptInput({ lang, busy, connected, commands, onSubmit,
246
246
  </div>
247
247
  )}
248
248
 
249
- <div className="flex items-end bg-white rounded-[12px] border border-border-light shadow-soft">
249
+ <div className="flex items-end bg-surface-card rounded-md border border-border-light shadow-soft focus-within:border-primary focus-within:ring-1 focus-within:ring-primary">
250
250
  <textarea
251
251
  value={value}
252
252
  onChange={handleChange}
@@ -254,7 +254,7 @@ export default function PromptInput({ lang, busy, connected, commands, onSubmit,
254
254
  placeholder={connected ? t(lang, 'input_placeholder') : t(lang, 'disconnected')}
255
255
  rows={1}
256
256
  disabled={!connected}
257
- className="flex-1 resize-none bg-transparent outline-none text-sm text-content-primary placeholder-content-disabled min-h-[36px] max-h-[140px] disabled:opacity-50 leading-normal py-2.5 pl-3 pr-2"
257
+ className="flex-1 resize-none bg-transparent text-sm text-content-primary placeholder-content-disabled min-h-[36px] max-h-[140px] focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed leading-normal py-2.5 pl-3 pr-2"
258
258
  style={{ height: 'auto', overflow: 'hidden' }}
259
259
  onInput={(e) => {
260
260
  const el = e.currentTarget;
@@ -267,7 +267,7 @@ export default function PromptInput({ lang, busy, connected, commands, onSubmit,
267
267
  disabled={!connected && !busy}
268
268
  className={`shrink-0 m-1.5 w-8 h-8 flex items-center justify-center rounded-full transition-colors cursor-pointer disabled:opacity-40 disabled:cursor-not-allowed ${
269
269
  busy
270
- ? 'bg-red-100 text-danger hover:bg-red-200 animate-pulse'
270
+ ? 'bg-danger/10 text-danger hover:bg-danger/20 animate-pulse'
271
271
  : 'bg-primary text-white hover:bg-primary-hover'
272
272
  }`}
273
273
  title={busy ? t(lang, 'task_stopped') : t(lang, 'send')}
@@ -67,7 +67,7 @@ export default function RightPanel({
67
67
  // 折叠态
68
68
  if (collapsed) {
69
69
  return (
70
- <aside className="w-12 bg-surface-card border-l border-border-light flex flex-col items-center py-4 shrink-0 select-none">
70
+ <aside className="w-12 bg-surface-main border-l border-border-light flex flex-col items-center py-4 shrink-0 select-none">
71
71
  <button onClick={onToggle} title={t(lang, 'expand_panel')}
72
72
  className="w-8 h-8 flex items-center justify-center rounded-lg text-content-secondary hover:bg-surface-hover hover:text-content-primary transition-colors cursor-pointer">
73
73
  <svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
@@ -87,7 +87,7 @@ export default function RightPanel({
87
87
  const projectRules = rules.filter((r) => r.source === 'project');
88
88
 
89
89
  return (
90
- <aside className="bg-surface-card border-l border-border-light flex flex-col h-full shrink-0 overflow-y-auto select-none" style={{ width: `${width}px` }}>
90
+ <aside className="bg-surface-main border-l border-border-light flex flex-col h-full shrink-0 overflow-y-auto select-none" style={{ width: `${width}px` }}>
91
91
  {/* 折叠按钮 */}
92
92
  <div className="px-5 pt-3 pb-1 flex justify-end">
93
93
  <button onClick={onToggle} title={t(lang, 'collapse_panel')}
@@ -55,7 +55,7 @@ export default function Sidebar({
55
55
 
56
56
  if (collapsed) {
57
57
  return (
58
- <div className="w-14 bg-surface-card border-r border-border-light flex flex-col items-center py-4 shrink-0 select-none">
58
+ <div className="w-14 bg-surface-main border-r border-border-light flex flex-col items-center py-4 shrink-0 select-none">
59
59
  <button
60
60
  onClick={onToggle}
61
61
  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"
@@ -70,7 +70,7 @@ export default function Sidebar({
70
70
  }
71
71
 
72
72
  return (
73
- <aside className="bg-surface-card border-r border-border-light flex flex-col h-full shrink-0 select-none" style={{ width: `${width}px` }}>
73
+ <aside className="bg-surface-main border-r border-border-light flex flex-col h-full shrink-0 select-none" style={{ width: `${width}px` }}>
74
74
  <div className="flex items-center justify-between px-5 py-4 border-b border-border-light">
75
75
  <button
76
76
  onClick={onToggle}
@@ -128,7 +128,7 @@ export default function Sidebar({
128
128
  <button
129
129
  key={s.value}
130
130
  onClick={() => onSelectSession(s.value)}
131
- className="w-full text-left px-3 py-2 rounded-lg text-sm text-content-secondary hover:bg-surface-hover hover:text-content-primary transition-colors cursor-pointer"
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"
132
132
  title={s.label}
133
133
  >
134
134
  <span className="line-clamp-2 leading-relaxed">{s.label}</span>
@@ -61,17 +61,17 @@ function Dropdown({ value, placeholder, options, onChange, onOpen }: {
61
61
  return (
62
62
  <div className="relative">
63
63
  <button onClick={() => { if (!open && onOpen) onOpen(); setOpen(!open); }}
64
- className="flex items-center gap-1.5 px-3 py-1.5 text-sm text-content-secondary hover:bg-surface-hover hover:text-content-primary rounded-lg transition-colors cursor-pointer border border-border-light bg-white">
64
+ className="flex items-center gap-1.5 px-3 py-1.5 text-sm text-content-secondary hover:bg-surface-card-alt hover:text-content-primary rounded-lg transition-colors cursor-pointer border border-border-light bg-surface-main">
65
65
  <span className={!value ? 'text-content-disabled' : ''}>{displayValue}</span>
66
66
  <span className="text-content-disabled text-[10px]">▾</span>
67
67
  </button>
68
68
  {open && (
69
69
  <>
70
70
  <div className="fixed inset-0 z-10" onClick={() => setOpen(false)} />
71
- <div className="absolute bottom-full left-0 mb-1 bg-white border border-border-light rounded-xl shadow-lg z-20 min-w-[160px] py-1 max-h-[40vh] overflow-y-auto">
71
+ <div className="absolute bottom-full left-0 mb-1 bg-surface-main border border-border-light rounded-xl shadow-lg z-20 min-w-[160px] py-1 max-h-[40vh] overflow-y-auto">
72
72
  {options.map((opt) => (
73
73
  <button key={opt.value} onClick={() => { onChange(opt.value); setOpen(false); }}
74
- className={`w-full text-left px-3 py-2 text-sm hover:bg-surface-hover transition-colors cursor-pointer ${opt.active ? 'text-primary font-medium bg-primary-light' : 'text-content-secondary'}`}>
74
+ className={`w-full text-left px-3 py-2 text-sm hover:bg-surface-card-alt transition-colors cursor-pointer ${opt.active ? 'text-primary font-medium bg-primary-light' : 'text-content-secondary'}`}>
75
75
  {opt.label}
76
76
  </button>
77
77
  ))}
@@ -112,6 +112,8 @@ export interface WebSocketSessionState {
112
112
  deleteSessions: { value: string; label: string }[];
113
113
  clearDeleteSessions: () => void;
114
114
  suppressInlineOptions: () => void;
115
+ suppressCommandResult: (count?: number) => void;
116
+ suppressTranscript: (duration?: number) => void;
115
117
  clearModal: () => void;
116
118
  setBusyTrue: () => void;
117
119
  requestSelectCommand: (command: string) => void;
@@ -164,10 +166,16 @@ export function useWebSocketSession(url: string): WebSocketSessionState {
164
166
  const onSelectRequestRef = useRef<((payload: SelectRequestPayload) => void) | null>(null);
165
167
  const onCommandResultRef = useRef<((text: string, type: string) => void) | null>(null);
166
168
  const suppressInlineRef = useRef(false);
169
+ const suppressCommandResultCountRef = useRef(0);
170
+ const suppressTranscriptRef = useRef(false);
167
171
 
168
172
  const setOnSelectRequest = useCallback((fn: ((payload: SelectRequestPayload) => void) | null) => { onSelectRequestRef.current = fn; }, []);
169
173
  const setOnCommandResult = useCallback((fn: ((text: string, type: string) => void) | null) => { onCommandResultRef.current = fn; }, []);
170
174
  const suppressInlineOptions = useCallback(() => { suppressInlineRef.current = true; }, []);
175
+ const suppressCommandResult = useCallback((count: number = 1) => { suppressCommandResultCountRef.current += count; }, []);
176
+ const suppressTranscript = useCallback(() => {
177
+ suppressTranscriptRef.current = true;
178
+ }, []);
171
179
 
172
180
  const pushStatic = useCallback((item: TranscriptItem): void => {
173
181
  setStaticItems((prev) => [...prev, item]);
@@ -243,6 +251,14 @@ export function useWebSocketSession(url: string): WebSocketSessionState {
243
251
  setTasks(evt.tasks ?? []);
244
252
  setCommands(evt.commands ?? []);
245
253
  setMcpServers((evt.mcp_servers as McpServerSnapshot[]) ?? []);
254
+ // 连接后自动获取 session 列表
255
+ setTimeout(() => {
256
+ const ws = wsRef.current;
257
+ if (ws && ws.readyState === WebSocket.OPEN) {
258
+ suppressInlineRef.current = true;
259
+ ws.send(JSON.stringify({ type: 'list_sessions' }));
260
+ }
261
+ }, 100);
246
262
  // 连接后自动获取 skills/plugins/rules 信息
247
263
  setTimeout(() => {
248
264
  const ws = wsRef.current;
@@ -313,6 +329,7 @@ export function useWebSocketSession(url: string): WebSocketSessionState {
313
329
  // === 转录 ===
314
330
  if (evt.type === 'transcript_item' && evt.item) {
315
331
  if (evt.item.role === 'user' && evt.item.text.startsWith('/')) return;
332
+ if (suppressTranscriptRef.current) return;
316
333
  pushStatic(evt.item as TranscriptItem);
317
334
  return;
318
335
  }
@@ -364,6 +381,11 @@ export function useWebSocketSession(url: string): WebSocketSessionState {
364
381
  // === 转录管理 ===
365
382
  if (evt.type === 'clear_transcript') { setStaticItems([]); clearAssistantDelta(); pendingToolCallsRef.current = []; setPendingToolCalls([]); return; }
366
383
  if (evt.type === 'replace_transcript' && evt.items) {
384
+ // 检查是否需要抑制显示(用于左侧栏操作解耦)
385
+ if (suppressTranscriptRef.current) {
386
+ suppressTranscriptRef.current = false;
387
+ return;
388
+ }
367
389
  setStaticItems((evt.items as TranscriptItem[]).filter((i) => !(i.role === 'user' && i.text.startsWith('/'))));
368
390
  clearAssistantDelta(); pendingToolCallsRef.current = []; setPendingToolCalls([]); return;
369
391
  }
@@ -464,6 +486,11 @@ export function useWebSocketSession(url: string): WebSocketSessionState {
464
486
  return;
465
487
  }
466
488
  }
489
+ // 检查是否需要抑制显示
490
+ if (suppressCommandResultCountRef.current > 0) {
491
+ suppressCommandResultCountRef.current--;
492
+ return;
493
+ }
467
494
  // 通知 App 显示 toast
468
495
  if (onCommandResultRef.current) {
469
496
  onCommandResultRef.current(msg, evt.command_result_data.type || 'info');
@@ -482,7 +509,7 @@ export function useWebSocketSession(url: string): WebSocketSessionState {
482
509
  mcpServers, skills, plugins, rules, modal, effortOptions, modelOptions, busy, ready, showThinking,
483
510
  todoItems, pendingToolCalls, swarmTeammates, swarmNotifications,
484
511
  bgAgentLabel, connected, sessions, deleteSessions, clearDeleteSessions, suppressInlineOptions,
485
- clearModal, requestSelectCommand,
512
+ suppressCommandResult, suppressTranscript, clearModal, requestSelectCommand,
486
513
  setEffortValue, setModelValue, sendRequest, clearStaticItems, setBusyTrue,
487
514
  setOnSelectRequest, setOnCommandResult,
488
515
  }), [
@@ -490,7 +517,7 @@ export function useWebSocketSession(url: string): WebSocketSessionState {
490
517
  mcpServers, skills, plugins, rules, modal, effortOptions, modelOptions, busy, ready, showThinking,
491
518
  todoItems, pendingToolCalls, swarmTeammates, swarmNotifications,
492
519
  bgAgentLabel, connected, sessions, deleteSessions, clearDeleteSessions, suppressInlineOptions,
493
- clearModal, requestSelectCommand,
520
+ suppressCommandResult, suppressTranscript, clearModal, requestSelectCommand,
494
521
  setEffortValue, setModelValue, sendRequest, clearStaticItems, setBusyTrue,
495
522
  setOnSelectRequest, setOnCommandResult,
496
523
  ]);
@@ -501,14 +528,22 @@ export function useWebSocketSession(url: string): WebSocketSessionState {
501
528
  function _parseSkillsResult(text: string): SkillSnapshot[] {
502
529
  const skills: SkillSnapshot[] = [];
503
530
  for (const line of text.split('\n')) {
504
- const m = line.match(/^-?\s*(.+?)\s*\[(\w+)\]\s*:\s*(.*)$/);
531
+ // 匹配格式: " 1. skill_name [source] — description"
532
+ const m = line.match(/^\s*\d+\.\s*(.+?)\s*\[(\w+)\]\s*(?:[—-]\s*(.*))?$/);
505
533
  if (m) {
506
- skills.push({ name: m[1]!.trim(), description: m[3]!.trim(), source: m[2]!.trim() });
534
+ skills.push({ name: m[1]!.trim(), description: m[3]?.trim() ?? '', source: m[2]!.trim() });
507
535
  continue;
508
536
  }
509
- const m2 = line.match(/^-?\s*(.+?)\s*\[(\w+)\]\s*$/);
537
+ // 匹配格式: "- skill_name [source]: description"
538
+ const m2 = line.match(/^-?\s*(.+?)\s*\[(\w+)\]\s*:\s*(.*)$/);
510
539
  if (m2) {
511
- skills.push({ name: m2[1]!.trim(), description: '', source: m2[2]!.trim() });
540
+ skills.push({ name: m2[1]!.trim(), description: m2[3]!.trim(), source: m2[2]!.trim() });
541
+ continue;
542
+ }
543
+ // 匹配格式: "- skill_name [source]"
544
+ const m3 = line.match(/^-?\s*(.+?)\s*\[(\w+)\]\s*$/);
545
+ if (m3) {
546
+ skills.push({ name: m3[1]!.trim(), description: '', source: m3[2]!.trim() });
512
547
  }
513
548
  }
514
549
  return skills;