illusion-code 0.1.6__tar.gz → 0.2.0__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 (480) hide show
  1. illusion_code-0.2.0/.python-version +1 -0
  2. {illusion_code-0.1.6 → illusion_code-0.2.0}/LICENSE +1 -1
  3. {illusion_code-0.1.6 → illusion_code-0.2.0}/PKG-INFO +258 -4
  4. {illusion_code-0.1.6 → illusion_code-0.2.0}/README.md +251 -3
  5. {illusion_code-0.1.6 → illusion_code-0.2.0}/README.zh-CN.md +251 -3
  6. illusion_code-0.2.0/docs/images/IllusionCode.png +0 -0
  7. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/package-lock.json +2 -2
  8. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/package.json +1 -1
  9. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/version.ts +1 -1
  10. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/package-lock.json +2 -2
  11. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/package.json +1 -1
  12. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/version.ts +1 -1
  13. {illusion_code-0.1.6 → illusion_code-0.2.0}/pyproject.toml +9 -1
  14. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/__init__.py +1 -1
  15. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/api/provider.py +2 -24
  16. illusion_code-0.2.0/src/illusion/channels/__init__.py +469 -0
  17. illusion_code-0.2.0/src/illusion/channels/base.py +141 -0
  18. illusion_code-0.2.0/src/illusion/channels/base_commands.py +190 -0
  19. illusion_code-0.2.0/src/illusion/channels/config.py +175 -0
  20. illusion_code-0.2.0/src/illusion/channels/feishu/__init__.py +43 -0
  21. illusion_code-0.2.0/src/illusion/channels/feishu/adapter.py +293 -0
  22. illusion_code-0.2.0/src/illusion/channels/feishu/commands.py +16 -0
  23. illusion_code-0.2.0/src/illusion/channels/feishu/messaging.py +406 -0
  24. illusion_code-0.2.0/src/illusion/channels/feishu/session_map.py +219 -0
  25. illusion_code-0.2.0/src/illusion/channels/feishu/ws_client.py +100 -0
  26. illusion_code-0.2.0/src/illusion/channels/pid.py +127 -0
  27. illusion_code-0.2.0/src/illusion/channels/serve.py +214 -0
  28. illusion_code-0.2.0/src/illusion/channels/tools/__init__.py +8 -0
  29. illusion_code-0.2.0/src/illusion/channels/tools/feishu_doc.py +148 -0
  30. illusion_code-0.2.0/src/illusion/channels/tools/feishu_drive.py +226 -0
  31. illusion_code-0.2.0/src/illusion/channels/weixin/__init__.py +47 -0
  32. illusion_code-0.2.0/src/illusion/channels/weixin/adapter.py +465 -0
  33. illusion_code-0.2.0/src/illusion/channels/weixin/commands.py +16 -0
  34. illusion_code-0.2.0/src/illusion/channels/weixin/ilink_api.py +604 -0
  35. illusion_code-0.2.0/src/illusion/channels/weixin/session_map.py +163 -0
  36. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/cli.py +298 -13
  37. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/auth.py +2 -2
  38. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/misc.py +27 -0
  39. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/session.py +24 -9
  40. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/config/i18n.py +56 -2
  41. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/config/paths.py +24 -0
  42. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/config/settings.py +17 -1
  43. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/coordinator/agent_definitions.py +33 -50
  44. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/__init__.py +10 -1
  45. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/exit_plan_mode_tool.py +2 -1
  46. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/ui/runtime.py +2 -1
  47. illusion_code-0.2.0/tests/channels/feishu/test_adapter.py +193 -0
  48. illusion_code-0.2.0/tests/channels/feishu/test_commands.py +102 -0
  49. illusion_code-0.2.0/tests/channels/feishu/test_session_map.py +95 -0
  50. illusion_code-0.2.0/tests/channels/test_base.py +38 -0
  51. illusion_code-0.2.0/tests/channels/test_base_commands.py +63 -0
  52. illusion_code-0.2.0/tests/channels/test_config.py +86 -0
  53. illusion_code-0.2.0/tests/channels/test_pid.py +73 -0
  54. illusion_code-0.2.0/tests/channels/test_tool_registration.py +37 -0
  55. illusion_code-0.2.0/tests/channels/tools/test_feishu_doc.py +60 -0
  56. illusion_code-0.2.0/tests/channels/tools/test_feishu_drive.py +64 -0
  57. illusion_code-0.2.0/tests/channels/weixin/test_adapter.py +93 -0
  58. illusion_code-0.2.0/tests/channels/weixin/test_config.py +45 -0
  59. illusion_code-0.2.0/tests/channels/weixin/test_ilink_api.py +183 -0
  60. illusion_code-0.2.0/tests/channels/weixin/test_session_map.py +58 -0
  61. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_config/test_settings.py +18 -5
  62. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_permissions/test_checker.py +34 -0
  63. illusion_code-0.2.0/tests/test_prompts/__init__.py +0 -0
  64. illusion_code-0.2.0/tests/test_swarm/__init__.py +0 -0
  65. illusion_code-0.2.0/tests/test_tools/__init__.py +0 -0
  66. illusion_code-0.2.0/tests/test_ui/__init__.py +0 -0
  67. illusion_code-0.1.6/.python-version +0 -1
  68. illusion_code-0.1.6/src/illusion/skills/bundled/content/coding-guidelines.md +0 -70
  69. {illusion_code-0.1.6 → illusion_code-0.2.0}/.github/workflows/publish.yml +0 -0
  70. {illusion_code-0.1.6 → illusion_code-0.2.0}/.gitignore +0 -0
  71. {illusion_code-0.1.6 → illusion_code-0.2.0}/docs/images/image1.png +0 -0
  72. {illusion_code-0.1.6 → illusion_code-0.2.0}/docs/images/image2.png +0 -0
  73. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/build.mjs +0 -0
  74. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/App.tsx +0 -0
  75. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/CommandPicker.tsx +0 -0
  76. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/Composer.tsx +0 -0
  77. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/ComposerController.tsx +0 -0
  78. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/ConversationView.tsx +0 -0
  79. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/Footer.tsx +0 -0
  80. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/MarkdownContent.tsx +0 -0
  81. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/MarkdownTable.tsx +0 -0
  82. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/ModalHost.tsx +0 -0
  83. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/MultilineTextInput.tsx +0 -0
  84. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/PromptInput.tsx +0 -0
  85. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/SelectModal.tsx +0 -0
  86. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/SidePanel.tsx +0 -0
  87. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/Spinner.tsx +0 -0
  88. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/StatusBar.tsx +0 -0
  89. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/SwarmPanel.tsx +0 -0
  90. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/TodoPanel.tsx +0 -0
  91. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/ToolCallDisplay.tsx +0 -0
  92. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/TranscriptPane.tsx +0 -0
  93. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/components/WelcomeBanner.tsx +0 -0
  94. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/hooks/useAnimationFrame.ts +0 -0
  95. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/hooks/useBackendSession.ts +0 -0
  96. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/hooks/useBlink.ts +0 -0
  97. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/hooks/useTerminalSize.ts +0 -0
  98. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/i18n.ts +0 -0
  99. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/index.tsx +0 -0
  100. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/theme/ThemeContext.tsx +0 -0
  101. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/theme/builtinThemes.ts +0 -0
  102. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/ToolInterface.ts +0 -0
  103. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/AgentTool.ts +0 -0
  104. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/BashTool.ts +0 -0
  105. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/CronTool.ts +0 -0
  106. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/EditTool.ts +0 -0
  107. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/GenericTool.ts +0 -0
  108. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/LspTool.ts +0 -0
  109. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/McpTool.ts +0 -0
  110. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/NotebookTool.ts +0 -0
  111. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/PlanTool.ts +0 -0
  112. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/ReadTool.ts +0 -0
  113. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/SearchTool.ts +0 -0
  114. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/SkillTool.ts +0 -0
  115. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/TaskTool.ts +0 -0
  116. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/WebTool.ts +0 -0
  117. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/WorktreeTool.ts +0 -0
  118. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/WriteTool.ts +0 -0
  119. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/tools/registry.ts +0 -0
  120. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/types.ts +0 -0
  121. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/utils/markdown.ts +0 -0
  122. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/src/utils/thinking.ts +0 -0
  123. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/terminal/tsconfig.json +0 -0
  124. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/index.html +0 -0
  125. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/postcss.config.js +0 -0
  126. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/App.tsx +0 -0
  127. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/components/ChatArea.tsx +0 -0
  128. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/components/MessageBubble.tsx +0 -0
  129. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/components/ModalCard.tsx +0 -0
  130. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/components/PromptInput.tsx +0 -0
  131. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/components/RightPanel.tsx +0 -0
  132. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/components/Sidebar.tsx +0 -0
  133. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/components/TodoPanel.tsx +0 -0
  134. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/components/Toolbar.tsx +0 -0
  135. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/components/WelcomeScreen.tsx +0 -0
  136. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/hooks/useWebSocketSession.ts +0 -0
  137. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/i18n.ts +0 -0
  138. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/index.css +0 -0
  139. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/main.tsx +0 -0
  140. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/remarkSuperscript.ts +0 -0
  141. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/types/protocol.ts +0 -0
  142. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/src/vite-env.d.ts +0 -0
  143. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/tailwind.config.js +0 -0
  144. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/tsconfig.json +0 -0
  145. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/tsconfig.node.json +0 -0
  146. {illusion_code-0.1.6 → illusion_code-0.2.0}/frontend/web/vite.config.ts +0 -0
  147. {illusion_code-0.1.6 → illusion_code-0.2.0}/scripts/build_frontend.py +0 -0
  148. {illusion_code-0.1.6 → illusion_code-0.2.0}/scripts/hatch_build.py +0 -0
  149. {illusion_code-0.1.6 → illusion_code-0.2.0}/scripts/publish.py +0 -0
  150. {illusion_code-0.1.6 → illusion_code-0.2.0}/scripts/sync_version.py +0 -0
  151. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/__main__.py +0 -0
  152. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/api/__init__.py +0 -0
  153. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/api/client.py +0 -0
  154. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/api/codex_client.py +0 -0
  155. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/api/compat.py +0 -0
  156. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/api/effort.py +0 -0
  157. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/api/errors.py +0 -0
  158. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/api/openai_client.py +0 -0
  159. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/api/registry.py +0 -0
  160. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/api/usage.py +0 -0
  161. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/auth/__init__.py +0 -0
  162. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/auth/codex_oauth.py +0 -0
  163. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/auth/copilot.py +0 -0
  164. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/auth/external.py +0 -0
  165. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/auth/flows.py +0 -0
  166. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/auth/manager.py +0 -0
  167. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/auth/storage.py +0 -0
  168. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/bridge/__init__.py +0 -0
  169. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/bridge/manager.py +0 -0
  170. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/bridge/session_runner.py +0 -0
  171. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/bridge/types.py +0 -0
  172. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/bridge/work_secret.py +0 -0
  173. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/__init__.py +0 -0
  174. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/bridge.py +0 -0
  175. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/context.py +0 -0
  176. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/git.py +0 -0
  177. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/helpers.py +0 -0
  178. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/__init__.py +0 -0
  179. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/analysis/__init__.py +0 -0
  180. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/analysis/architecture.py +0 -0
  181. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/analysis/conventions.py +0 -0
  182. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/analysis/dependencies.py +0 -0
  183. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/analysis/key_modules.py +0 -0
  184. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/extraction/__init__.py +0 -0
  185. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/extraction/lsp_symbols.py +0 -0
  186. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/extraction/readme.py +0 -0
  187. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/extraction/scanner.py +0 -0
  188. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/generation/__init__.py +0 -0
  189. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/generation/claudemd.py +0 -0
  190. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/generation/illusionmd.py +0 -0
  191. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/generation/memory_template.py +0 -0
  192. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/generation/rules.py +0 -0
  193. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/generation/sections.py +0 -0
  194. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/orchestrator.py +0 -0
  195. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/init/types.py +0 -0
  196. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/mcp.py +0 -0
  197. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/memory.py +0 -0
  198. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/model.py +0 -0
  199. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/plugin.py +0 -0
  200. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/registry.py +0 -0
  201. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/rules.py +0 -0
  202. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/sandbox.py +0 -0
  203. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/settings.py +0 -0
  204. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/commands/types.py +0 -0
  205. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/config/__init__.py +0 -0
  206. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/config/plan_file.py +0 -0
  207. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/coordinator/__init__.py +0 -0
  208. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/coordinator/coordinator_mode.py +0 -0
  209. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/engine/__init__.py +0 -0
  210. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/engine/cost_tracker.py +0 -0
  211. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/engine/messages.py +0 -0
  212. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/engine/query.py +0 -0
  213. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/engine/query_engine.py +0 -0
  214. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/engine/stream_events.py +0 -0
  215. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/hooks/__init__.py +0 -0
  216. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/hooks/events.py +0 -0
  217. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/hooks/executor.py +0 -0
  218. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/hooks/hot_reload.py +0 -0
  219. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/hooks/loader.py +0 -0
  220. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/hooks/register_hooks.py +0 -0
  221. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/hooks/schemas.py +0 -0
  222. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/hooks/session_hooks.py +0 -0
  223. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/hooks/types.py +0 -0
  224. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/hooks/utils.py +0 -0
  225. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/mcp/__init__.py +0 -0
  226. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/mcp/client.py +0 -0
  227. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/mcp/config.py +0 -0
  228. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/mcp/types.py +0 -0
  229. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/memory/__init__.py +0 -0
  230. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/memory/manager.py +0 -0
  231. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/memory/memdir.py +0 -0
  232. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/memory/paths.py +0 -0
  233. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/memory/scan.py +0 -0
  234. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/memory/search.py +0 -0
  235. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/memory/types.py +0 -0
  236. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/output_styles/__init__.py +0 -0
  237. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/output_styles/loader.py +0 -0
  238. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/permissions/__init__.py +0 -0
  239. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/permissions/checker.py +0 -0
  240. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/permissions/modes.py +0 -0
  241. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/platforms.py +0 -0
  242. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/plugins/__init__.py +0 -0
  243. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/plugins/installer.py +0 -0
  244. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/plugins/loader.py +0 -0
  245. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/plugins/options.py +0 -0
  246. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/plugins/schemas.py +0 -0
  247. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/plugins/types.py +0 -0
  248. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/prompts/__init__.py +0 -0
  249. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/prompts/claudemd.py +0 -0
  250. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/prompts/context.py +0 -0
  251. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/prompts/environment.py +0 -0
  252. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/prompts/system_prompt.py +0 -0
  253. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/sandbox/__init__.py +0 -0
  254. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/sandbox/adapter.py +0 -0
  255. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/sandbox/platforms/__init__.py +0 -0
  256. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/sandbox/platforms/base.py +0 -0
  257. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/sandbox/platforms/linux.py +0 -0
  258. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/sandbox/platforms/macos.py +0 -0
  259. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/sandbox/platforms/windows.py +0 -0
  260. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/sandbox/proxy/__init__.py +0 -0
  261. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/sandbox/proxy/env_vars.py +0 -0
  262. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/sandbox/runtime.py +0 -0
  263. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/sandbox/symlink_protection.py +0 -0
  264. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/sandbox/utils.py +0 -0
  265. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/sandbox/violation_store.py +0 -0
  266. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/__init__.py +0 -0
  267. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/compact/__init__.py +0 -0
  268. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/compact/auto_compact.py +0 -0
  269. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/compact/compact_core.py +0 -0
  270. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/compact/compact_prompt.py +0 -0
  271. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/compact/constants.py +0 -0
  272. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/compact/message_ops.py +0 -0
  273. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/compact/microcompact.py +0 -0
  274. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/compact/models.py +0 -0
  275. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/compact/token_utils.py +0 -0
  276. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/cron.py +0 -0
  277. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/cron_scheduler.py +0 -0
  278. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/file_history.py +0 -0
  279. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/lsp/__init__.py +0 -0
  280. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/lsp/client.py +0 -0
  281. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/lsp/config.py +0 -0
  282. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/lsp/manager.py +0 -0
  283. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/lsp/types.py +0 -0
  284. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/session_storage.py +0 -0
  285. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/services/token_estimation.py +0 -0
  286. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/skills/__init__.py +0 -0
  287. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/skills/bundled/__init__.py +0 -0
  288. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/batch.md +0 -0
  289. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/debug.md +0 -0
  290. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/loop.md +0 -0
  291. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/remember.md +0 -0
  292. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/simplify.md +0 -0
  293. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/skillify.md +0 -0
  294. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/stuck.md +0 -0
  295. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/update-config.md +0 -0
  296. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/verify.md +0 -0
  297. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/skills/loader.py +0 -0
  298. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/skills/registry.py +0 -0
  299. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/skills/types.py +0 -0
  300. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/state/__init__.py +0 -0
  301. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/state/app_state.py +0 -0
  302. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/state/store.py +0 -0
  303. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/swarm/__init__.py +0 -0
  304. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/swarm/agent_executor.py +0 -0
  305. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/swarm/in_process.py +0 -0
  306. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/swarm/subprocess_backend.py +0 -0
  307. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/swarm/team_helpers.py +0 -0
  308. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/swarm/types.py +0 -0
  309. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/swarm/worktree.py +0 -0
  310. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tasks/__init__.py +0 -0
  311. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tasks/local_agent_task.py +0 -0
  312. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tasks/local_shell_task.py +0 -0
  313. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tasks/manager.py +0 -0
  314. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tasks/stop_task.py +0 -0
  315. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tasks/types.py +0 -0
  316. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/agent_tool.py +0 -0
  317. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/ask_user_question_tool.py +0 -0
  318. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/base.py +0 -0
  319. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/bash_tool.py +0 -0
  320. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/config_tool.py +0 -0
  321. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/cron_tool.py +0 -0
  322. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/enter_plan_mode_tool.py +0 -0
  323. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/enter_worktree_tool.py +0 -0
  324. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/exit_worktree_tool.py +0 -0
  325. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/file_edit_tool.py +0 -0
  326. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/file_read_tool.py +0 -0
  327. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/file_write_tool.py +0 -0
  328. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/glob_tool.py +0 -0
  329. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/grep_tool.py +0 -0
  330. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/list_mcp_resources_tool.py +0 -0
  331. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/lsp_formatters.py +0 -0
  332. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/lsp_schemas.py +0 -0
  333. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/lsp_tool.py +0 -0
  334. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/mcp_auth_tool.py +0 -0
  335. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/mcp_tool.py +0 -0
  336. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/notebook_edit_tool.py +0 -0
  337. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/powershell_tool.py +0 -0
  338. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/read_mcp_resource_tool.py +0 -0
  339. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/repl_tool.py +0 -0
  340. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/send_message_tool.py +0 -0
  341. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/shell_common.py +0 -0
  342. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/skill_tool.py +0 -0
  343. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/sleep_tool.py +0 -0
  344. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/structured_output_tool.py +0 -0
  345. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/task_create_tool.py +0 -0
  346. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/task_get_tool.py +0 -0
  347. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/task_list_tool.py +0 -0
  348. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/task_output_tool.py +0 -0
  349. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/task_stop_tool.py +0 -0
  350. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/task_update_tool.py +0 -0
  351. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/team_create_tool.py +0 -0
  352. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/team_delete_tool.py +0 -0
  353. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/todo_write_tool.py +0 -0
  354. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/tool_search_tool.py +0 -0
  355. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/web_fetch_tool.py +0 -0
  356. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/tools/web_search_tool.py +0 -0
  357. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/ui/__init__.py +0 -0
  358. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/ui/app.py +0 -0
  359. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/ui/backend_host.py +0 -0
  360. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/ui/input.py +0 -0
  361. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/ui/output.py +0 -0
  362. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/ui/permission_dialog.py +0 -0
  363. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/ui/permission_store.py +0 -0
  364. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/ui/protocol.py +0 -0
  365. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/ui/react_launcher.py +0 -0
  366. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/ui/textual_app.py +0 -0
  367. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/ui/web/__init__.py +0 -0
  368. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/ui/web/server.py +0 -0
  369. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/ui/web/ws_host.py +0 -0
  370. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/utils/__init__.py +0 -0
  371. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/utils/ripgrep.py +0 -0
  372. {illusion_code-0.1.6 → illusion_code-0.2.0}/src/illusion/utils/shell.py +0 -0
  373. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/__init__.py +0 -0
  374. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/api/test_anthropic_client.py +0 -0
  375. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/api/test_client.py +0 -0
  376. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/api/test_codex_client.py +0 -0
  377. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/api/test_effort.py +0 -0
  378. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/api/test_fallback/346/217/220/347/244/272.py" +0 -0
  379. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/api/test_openai_client.py +0 -0
  380. {illusion_code-0.1.6/tests/commands/init → illusion_code-0.2.0/tests/channels}/__init__.py +0 -0
  381. {illusion_code-0.1.6/tests/test_api → illusion_code-0.2.0/tests/channels/feishu}/__init__.py +0 -0
  382. {illusion_code-0.1.6/tests/test_commands → illusion_code-0.2.0/tests/channels/tools}/__init__.py +0 -0
  383. {illusion_code-0.1.6/tests/test_config → illusion_code-0.2.0/tests/channels/weixin}/__init__.py +0 -0
  384. {illusion_code-0.1.6/tests/test_engine → illusion_code-0.2.0/tests/commands/init}/__init__.py +0 -0
  385. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/commands/init/test_claudemd.py +0 -0
  386. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/commands/init/test_orchestrator.py +0 -0
  387. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/commands/init/test_scanner.py +0 -0
  388. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/commands/init/test_sections.py +0 -0
  389. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/commands/test_effort_command.py +0 -0
  390. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/config/test_i18n.py +0 -0
  391. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/config/test_settings.py +0 -0
  392. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/conftest.py +0 -0
  393. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/engine/test_query_engine.py +0 -0
  394. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/fixtures/fake_mcp_server.py +0 -0
  395. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/integration/test_effort_integration.py +0 -0
  396. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/services/lsp/test_lsp_client.py +0 -0
  397. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/services/lsp/test_lsp_config.py +0 -0
  398. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/services/lsp/test_lsp_manager.py +0 -0
  399. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/services/lsp/test_lsp_types.py +0 -0
  400. {illusion_code-0.1.6/tests/test_hooks → illusion_code-0.2.0/tests/test_api}/__init__.py +0 -0
  401. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_api/test_client.py +0 -0
  402. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_api/test_codex_client.py +0 -0
  403. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_api/test_compat.py +0 -0
  404. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_api/test_openai_client.py +0 -0
  405. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_auth/test_external.py +0 -0
  406. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_bridge/test_core.py +0 -0
  407. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_bridge/test_session_flow.py +0 -0
  408. {illusion_code-0.1.6/tests/test_mcp → illusion_code-0.2.0/tests/test_commands}/__init__.py +0 -0
  409. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_commands/test_cli.py +0 -0
  410. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_commands/test_command_flows.py +0 -0
  411. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_commands/test_registry.py +0 -0
  412. {illusion_code-0.1.6/tests/test_memory → illusion_code-0.2.0/tests/test_config}/__init__.py +0 -0
  413. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_config/test_paths.py +0 -0
  414. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_coordinator/test_agent_definitions.py +0 -0
  415. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_coordinator/test_coordinator_mode.py +0 -0
  416. {illusion_code-0.1.6/tests/test_permissions → illusion_code-0.2.0/tests/test_engine}/__init__.py +0 -0
  417. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_engine/test_media_block.py +0 -0
  418. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_engine/test_query_engine.py +0 -0
  419. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_engine/test_tool_result_media.py +0 -0
  420. {illusion_code-0.1.6/tests/test_plugins → illusion_code-0.2.0/tests/test_hooks}/__init__.py +0 -0
  421. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_hooks/test_executor.py +0 -0
  422. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_hooks_skills_plugins_real.py +0 -0
  423. {illusion_code-0.1.6/tests/test_prompts → illusion_code-0.2.0/tests/test_mcp}/__init__.py +0 -0
  424. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_mcp/test_integration.py +0 -0
  425. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_mcp/test_stdio_flow.py +0 -0
  426. {illusion_code-0.1.6/tests/test_swarm → illusion_code-0.2.0/tests/test_memory}/__init__.py +0 -0
  427. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_memory/test_memdir.py +0 -0
  428. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_merged_prs_on_autoagent.py +0 -0
  429. {illusion_code-0.1.6/tests/test_tools → illusion_code-0.2.0/tests/test_permissions}/__init__.py +0 -0
  430. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_platforms.py +0 -0
  431. {illusion_code-0.1.6/tests/test_ui → illusion_code-0.2.0/tests/test_plugins}/__init__.py +0 -0
  432. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_plugins/test_lifecycle_flow.py +0 -0
  433. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_plugins/test_loader.py +0 -0
  434. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_prompts/test_claudemd.py +0 -0
  435. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_prompts/test_environment.py +0 -0
  436. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_prompts/test_system_prompt.py +0 -0
  437. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_real_large_tasks.py +0 -0
  438. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_sandbox/test_adapter.py +0 -0
  439. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_sandbox/test_config_schema.py +0 -0
  440. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_sandbox/test_platform_linux.py +0 -0
  441. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_sandbox/test_platform_macos.py +0 -0
  442. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_sandbox/test_platform_windows.py +0 -0
  443. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_sandbox/test_proxy_env_vars.py +0 -0
  444. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_sandbox/test_runtime.py +0 -0
  445. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_sandbox/test_symlink_protection.py +0 -0
  446. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_sandbox/test_utils.py +0 -0
  447. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_sandbox/test_violation_store.py +0 -0
  448. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_scripts/test_sync_version.py +0 -0
  449. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_services/test_compact.py +0 -0
  450. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_services/test_cron.py +0 -0
  451. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_services/test_cron_scheduler.py +0 -0
  452. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_services/test_session_storage.py +0 -0
  453. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_skills/test_loader.py +0 -0
  454. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_swarm/test_agent_executor.py +0 -0
  455. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_swarm/test_imports.py +0 -0
  456. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_swarm/test_in_process.py +0 -0
  457. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_swarm/test_types.py +0 -0
  458. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_swarm/test_worktree.py +0 -0
  459. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_tasks/test_manager.py +0 -0
  460. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_tools/test_agent_tool.py +0 -0
  461. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_tools/test_core_tools.py +0 -0
  462. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_tools/test_file_read_media.py +0 -0
  463. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_tools/test_glob_tool.py +0 -0
  464. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_tools/test_grep_tool.py +0 -0
  465. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_tools/test_integration.py +0 -0
  466. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_tools/test_integration_flows.py +0 -0
  467. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_tools/test_mcp_auth_tool.py +0 -0
  468. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_tools/test_ripgrep.py +0 -0
  469. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_tools/test_shell_common.py +0 -0
  470. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_tools/test_task_tools.py +0 -0
  471. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_tools/test_team_tools.py +0 -0
  472. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_tools/test_web_fetch_tool.py +0 -0
  473. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_ui/test_modes.py +0 -0
  474. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_ui/test_permission_store.py +0 -0
  475. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_ui/test_react_backend.py +0 -0
  476. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_ui/test_react_launcher.py +0 -0
  477. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_ui/test_textual_app.py +0 -0
  478. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_untested_features.py +0 -0
  479. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/test_utils/test_shell.py +0 -0
  480. {illusion_code-0.1.6 → illusion_code-0.2.0}/tests/ui/test_backend_host.py +0 -0
@@ -0,0 +1 @@
1
+ 3.12
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 IllusionCode Contributors
3
+ Copyright (c) 2025 YunTai (YunTaiHua)
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: illusion-code
3
- Version: 0.1.6
3
+ Version: 0.2.0
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
@@ -44,6 +44,12 @@ Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
44
44
  Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
45
45
  Requires-Dist: pytest>=8.0.0; extra == 'dev'
46
46
  Requires-Dist: ruff>=0.5.0; extra == 'dev'
47
+ Provides-Extra: feishu
48
+ Requires-Dist: lark-oapi>=1.4.0; extra == 'feishu'
49
+ Provides-Extra: weixin
50
+ Requires-Dist: aiohttp>=3.9.0; extra == 'weixin'
51
+ Requires-Dist: cryptography>=42.0.0; extra == 'weixin'
52
+ Requires-Dist: qrcode>=7.4.0; extra == 'weixin'
47
53
  Description-Content-Type: text/markdown
48
54
 
49
55
  # IllusionCode
@@ -92,10 +98,10 @@ IllusionCode is an open-source AI-powered command-line programming assistant tha
92
98
 
93
99
  <div align="center">
94
100
  <p>Demo video</p>
95
- <a href="https://www.youtube.com/watch?v=Hongxz0vhrg">
96
- <img src="docs/images/image1.png" alt="Click to watch demo video" width="720" />
101
+ <a href="https://www.youtube.com/watch?v=ExrzKVjWPls">
102
+ <img src="docs/images/IllusionCode.png" alt="Click to watch demo video" width="720" />
97
103
  </a>
98
- <p><a href="https://www.youtube.com/watch?v=Hongxz0vhrg">📺 Watch demo on YouTube</a></p>
104
+ <p><a href="https://www.youtube.com/watch?v=ExrzKVjWPls">📺 Watch demo on YouTube</a></p>
99
105
  </div>
100
106
 
101
107
  ### Design Origins & Innovations
@@ -311,6 +317,14 @@ illusion plugin list # List plugins
311
317
  illusion plugin install <source> # Install plugin
312
318
  illusion plugin uninstall <name> # Uninstall plugin
313
319
 
320
+ # Channel management (Feishu/Lark messaging)
321
+ illusion channel login # Interactive channel setup (select channel → configure credentials)
322
+ illusion channel serve # Run channel daemon in foreground (listen for messages)
323
+ illusion channel status # View channel status (enabled/connected/PID)
324
+ illusion channel enable feishu # Enable a channel
325
+ illusion channel disable feishu # Disable a channel
326
+ illusion channel logout feishu # Clear channel credentials
327
+
314
328
  # Scheduled tasks
315
329
  illusion cron start # Start scheduler
316
330
  illusion cron stop # Stop scheduler
@@ -1406,6 +1420,246 @@ When an LLM operation triggers a sandbox restriction (e.g., reading a file in `d
1406
1420
 
1407
1421
  ---
1408
1422
 
1423
+ ## 📱 Messaging Channels
1424
+
1425
+ IllusionCode supports messaging channels that let you interact with the AI assistant from messaging apps like Feishu (Lark) and WeChat. This enables **remote work continuation** — start a task on your terminal, then continue it from your phone.
1426
+
1427
+ ### How It Works
1428
+
1429
+ ```
1430
+ illusion (main program)
1431
+ ├─ Reads channels.json → feishu.enabled / weixin.enabled
1432
+ ├─ Silently spawns 'illusion channel serve' as a background daemon
1433
+ │ └─ Feishu: WS long connection → agent → streaming card reply
1434
+ │ └─ WeChat: HTTP long-poll → agent → typing indicator + text reply
1435
+ └─ run_repl() ← Local terminal interaction (unaffected)
1436
+
1437
+ Your phone
1438
+ └─ Send message → daemon receives → agent processes → reply
1439
+ ```
1440
+
1441
+ ### Supported Channels
1442
+
1443
+ | Channel | Protocol | Streaming | Group Chat | Status |
1444
+ |---------|----------|-----------|------------|--------|
1445
+ | Feishu / Lark | WS long connection | Interactive card (JSON 2.0) | ✅ | Production ready |
1446
+ | WeChat (iLink Bot) | HTTP long-poll | Typing indicator + text | ❌ (DM only) | Production ready |
1447
+
1448
+ ### Quick Start (Feishu)
1449
+
1450
+ #### 1. Create a Feishu App
1451
+
1452
+ 1. Go to [Feishu Open Platform](https://open.feishu.cn/app) (Lark: [open.larksuite.com](https://open.larksuite.com/app))
1453
+ 2. Create a **Custom App** (自建应用)
1454
+ 3. Enable the **Bot** capability (机器人能力)
1455
+ 4. Under **Event Subscriptions** (事件订阅), select **Long Connection mode** (长连接模式)
1456
+ 5. Subscribe to the event: `im.message.receive_v1` (接收消息)
1457
+ 6. Record your **App ID** and **App Secret**
1458
+
1459
+ #### 2. Configure the Channel
1460
+
1461
+ ```bash
1462
+ illusion channel login
1463
+ ```
1464
+
1465
+ This launches an interactive setup wizard:
1466
+
1467
+ ```
1468
+ 选择渠道 / Select a channel:
1469
+ 1. 飞书 / Feishu (Lark)
1470
+ 输入序号: 1
1471
+
1472
+ --- 飞书渠道配置 ---
1473
+ 选择平台 / Select platform:
1474
+ 1. 飞书 (open.feishu.cn)
1475
+ 2. Lark (open.larksuite.com)
1476
+ 输入序号: 1
1477
+
1478
+ 输入 App ID: cli_a1b2c3...
1479
+ 输入 App Secret: 明文输入
1480
+
1481
+ 是否启用群组会话按用户隔离? (Y/n): Y
1482
+ 群组中是否要求 @机器人才响应? (Y/n): Y
1483
+ 是否允许其他机器人消息? (y/N): N
1484
+
1485
+ 正在安装依赖 lark-oapi... ✓
1486
+ 配置已保存,飞书渠道已启用。
1487
+ ```
1488
+
1489
+ - The `lark-oapi` SDK is **automatically installed** on first setup (as an optional dependency)
1490
+ - Credentials are stored in plaintext in `~/.illusion/channels.json` (per requirement, not masked)
1491
+ - The channel is **auto-activated** on next `illusion` launch
1492
+
1493
+ #### 3. Start Using
1494
+
1495
+ ```bash
1496
+ # Option A: Let illusion auto-activate the channel (silent background daemon)
1497
+ illusion # Channel daemon starts automatically, REPL runs normally
1498
+
1499
+ # Option B: Run the daemon in foreground (see logs, Ctrl+C to stop)
1500
+ illusion channel serve
1501
+ ```
1502
+
1503
+ Now send a message to your bot in Feishu — you'll get a streaming card reply with full Markdown rendering.
1504
+
1505
+ ### Channel Configuration (channels.json)
1506
+
1507
+ Channel config is stored separately in `~/.illusion/channels.json` (not in `settings.json`):
1508
+
1509
+ ```json
1510
+ {
1511
+ "feishu": {
1512
+ "enabled": true,
1513
+ "app_id": "cli_xxx",
1514
+ "app_secret": "your-secret",
1515
+ "domain": "feishu",
1516
+ "require_mention": true,
1517
+ "allow_bots": false,
1518
+ "group_sessions_per_user": true,
1519
+ "group_policy": {
1520
+ "mode": "open",
1521
+ "allowlist": [],
1522
+ "blacklist": [],
1523
+ "admin_list": []
1524
+ }
1525
+ }
1526
+ }
1527
+ ```
1528
+
1529
+ | Field | Default | Description |
1530
+ |-------|---------|-------------|
1531
+ | `enabled` | `false` | Whether the channel is active |
1532
+ | `app_id` | — | Feishu App ID |
1533
+ | `app_secret` | — | Feishu App Secret (plaintext) |
1534
+ | `domain` | `"feishu"` | `"feishu"` (China) or `"lark"` (International) |
1535
+ | `require_mention` | `true` | In groups, only respond when @mentioned |
1536
+ | `allow_bots` | `false` | Whether to process messages from other bots |
1537
+ | `group_sessions_per_user` | `true` | Isolate sessions per user in groups |
1538
+ | `group_policy.mode` | `"open"` | `"open"` / `"disabled"` / `"allowlist"` / `"blacklist"` |
1539
+ | `group_policy.allowlist` | `[]` | Allowed chat_ids (when mode=allowlist) |
1540
+ | `group_policy.blacklist` | `[]` | Blocked chat_ids (when mode=blacklist) |
1541
+ | `group_policy.admin_list` | `[]` | user_ids that always bypass policy |
1542
+
1543
+ ### Feishu Slash Commands
1544
+
1545
+ You can manage sessions directly from Feishu chats:
1546
+
1547
+ | Command | Description |
1548
+ |---------|-------------|
1549
+ | `/help` | List available commands |
1550
+ | `/clear` | Clear current Feishu session history |
1551
+ | `/new` | Start a new Feishu session |
1552
+ | `/sessions` | List local terminal sessions (unfinished work) |
1553
+ | `/resume [id\|index]` | Resume a local terminal session into Feishu |
1554
+ | `/detach` | Save current Feishu session as a local terminal session |
1555
+ | `/model [show\|set NAME]` | View or switch the session model |
1556
+
1557
+ **Remote work continuation workflow:**
1558
+ 1. Start a coding task in your terminal, exit midway
1559
+ 2. From Feishu, send `/sessions` — see your unfinished terminal sessions
1560
+ 3. Send `/resume 1` — pull the session into Feishu, continue working
1561
+ 4. Send `/detach` — save it back to local, resume in terminal with `illusion --resume <id>`
1562
+
1563
+ ### Feishu Built-in Tools
1564
+
1565
+ When the Feishu channel is enabled, the agent gains access to Feishu-specific tools:
1566
+
1567
+ | Tool | Description |
1568
+ |------|-------------|
1569
+ | `feishu_doc_read` | Read a Feishu Docx/Wiki document as plain text |
1570
+ | `feishu_doc_create` | Create a new Feishu Docx document |
1571
+ | `feishu_drive_list` | List files in a Feishu Drive folder |
1572
+ | `feishu_drive_upload` | Upload a local file to Feishu Drive |
1573
+ | `feishu_drive_download` | Download a Feishu Drive file to local |
1574
+
1575
+ These tools use the same App credentials and are available to the agent automatically.
1576
+
1577
+ ### Permission Interaction
1578
+
1579
+ When the agent requests permission for a tool (e.g., running a bash command), the request is **pushed to Feishu**:
1580
+
1581
+ ```
1582
+ ⚠️ 工具 bash 请求权限:执行 ls -la
1583
+ 回复 'y' 批准(120s 超时自动拒绝)
1584
+ ```
1585
+
1586
+ Reply `y` to approve, or wait for auto-deny after 120s. Same mechanism applies to `ask_user` questions and plan approvals.
1587
+
1588
+ ### Troubleshooting
1589
+
1590
+ | Problem | Solution |
1591
+ |---------|----------|
1592
+ | No response in Feishu | Check `~/.illusion/channels/serve.log` for errors |
1593
+ | Daemon didn't auto-start | Run `illusion channel status` to check; manually run `illusion channel serve` to see logs |
1594
+ | `processor not found` in logs | Harmless — this is the read-receipt event, already handled with a no-op processor |
1595
+ | Card not rendering tables | Ensure your Feishu client is v7.20+ (JSON 2.0 cards require it) |
1596
+ | WS connection keeps reconnecting | Verify App ID/Secret are correct; check event subscription is set to Long Connection mode |
1597
+ | Edit limit (230072) | Not applicable — cards use `message.patch` which has no edit count limit |
1598
+
1599
+ ### Quick Start (WeChat)
1600
+
1601
+ WeChat uses the **iLink Bot API** (Tencent's official Bot API via HTTPS long-poll). It's not a reverse-engineering hook — no WeChat client needs to be running.
1602
+
1603
+ #### 1. Configure the Channel
1604
+
1605
+ ```bash
1606
+ illusion channel login
1607
+ # Select: 2. WeChat
1608
+ ```
1609
+
1610
+ This will:
1611
+ 1. Auto-install `aiohttp`, `cryptography`, `qrcode` (first time only)
1612
+ 2. Open your browser with a QR code page
1613
+ 3. Scan with WeChat to authorize the bot identity
1614
+ 4. Save credentials to `~/.illusion/channels.json`
1615
+
1616
+ #### 2. Start Using
1617
+
1618
+ ```bash
1619
+ illusion # Auto-activates WeChat daemon in background
1620
+ # or
1621
+ illusion channel serve # Foreground mode with logs
1622
+ ```
1623
+
1624
+ Send a message to your bot in WeChat — you'll see "typing..." indicator, then the full reply.
1625
+
1626
+ #### 3. Key Limitations
1627
+
1628
+ - **DM only** — bot identity cannot join normal WeChat groups
1629
+ - **No message editing** — replies are sent as complete text (typing indicator shows during processing)
1630
+ - **2000 char limit** — longer replies auto-split into multiple messages with 1.5s delay
1631
+ - **Session expires** — if you see `errcode=-14`, re-run `illusion channel login` to re-scan
1632
+
1633
+ ### Channel Architecture
1634
+
1635
+ ```
1636
+ src/illusion/channels/
1637
+ ├── __init__.py # ChannelRunner (message→agent glue) + maybe_spawn_channel_daemon
1638
+ ├── base.py # Channel ABC + InboundMessage + typing methods
1639
+ ├── base_commands.py # BaseCommandHandler (shared slash commands)
1640
+ ├── config.py # ChannelsConfig / FeishuChannelConfig / WeixinChannelConfig
1641
+ ├── serve.py # 'illusion channel serve' entry point (multi-channel)
1642
+ ├── pid.py # PID file management (avoid duplicate daemons)
1643
+ ├── feishu/
1644
+ │ ├── adapter.py # FeishuChannel: WS connection, event dispatch, admission control
1645
+ │ ├── ws_client.py # lark-oapi WS client wrapper
1646
+ │ ├── messaging.py # Card send/patch, message rendering
1647
+ │ ├── stream_editor.py # Streaming card editor (throttled patch updates)
1648
+ │ ├── session_map.py # Feishu session store (chat_id → session)
1649
+ │ └── commands.py # FeishuCommandHandler (extends BaseCommandHandler)
1650
+ ├── weixin/
1651
+ │ ├── __init__.py # WEIXIN_DEPENDENCIES / ensure_weixin_dependencies
1652
+ │ ├── adapter.py # WeixinChannel: long-poll, admission, context_token, typing
1653
+ │ ├── ilink_api.py # iLink Bot API client (QR login / send / poll / typing)
1654
+ │ ├── session_map.py # WeixinSessionStore (user_id → session)
1655
+ │ └── commands.py # WeixinCommandHandler (extends BaseCommandHandler)
1656
+ └── tools/
1657
+ ├── feishu_doc.py # feishu_doc_read / feishu_doc_create
1658
+ └── feishu_drive.py # feishu_drive_list / upload / download
1659
+ ```
1660
+
1661
+ ---
1662
+
1409
1663
  ## 🔌 Extension Development
1410
1664
 
1411
1665
  ### Plugin System
@@ -44,10 +44,10 @@ IllusionCode is an open-source AI-powered command-line programming assistant tha
44
44
 
45
45
  <div align="center">
46
46
  <p>Demo video</p>
47
- <a href="https://www.youtube.com/watch?v=Hongxz0vhrg">
48
- <img src="docs/images/image1.png" alt="Click to watch demo video" width="720" />
47
+ <a href="https://www.youtube.com/watch?v=ExrzKVjWPls">
48
+ <img src="docs/images/IllusionCode.png" alt="Click to watch demo video" width="720" />
49
49
  </a>
50
- <p><a href="https://www.youtube.com/watch?v=Hongxz0vhrg">📺 Watch demo on YouTube</a></p>
50
+ <p><a href="https://www.youtube.com/watch?v=ExrzKVjWPls">📺 Watch demo on YouTube</a></p>
51
51
  </div>
52
52
 
53
53
  ### Design Origins & Innovations
@@ -263,6 +263,14 @@ illusion plugin list # List plugins
263
263
  illusion plugin install <source> # Install plugin
264
264
  illusion plugin uninstall <name> # Uninstall plugin
265
265
 
266
+ # Channel management (Feishu/Lark messaging)
267
+ illusion channel login # Interactive channel setup (select channel → configure credentials)
268
+ illusion channel serve # Run channel daemon in foreground (listen for messages)
269
+ illusion channel status # View channel status (enabled/connected/PID)
270
+ illusion channel enable feishu # Enable a channel
271
+ illusion channel disable feishu # Disable a channel
272
+ illusion channel logout feishu # Clear channel credentials
273
+
266
274
  # Scheduled tasks
267
275
  illusion cron start # Start scheduler
268
276
  illusion cron stop # Stop scheduler
@@ -1358,6 +1366,246 @@ When an LLM operation triggers a sandbox restriction (e.g., reading a file in `d
1358
1366
 
1359
1367
  ---
1360
1368
 
1369
+ ## 📱 Messaging Channels
1370
+
1371
+ IllusionCode supports messaging channels that let you interact with the AI assistant from messaging apps like Feishu (Lark) and WeChat. This enables **remote work continuation** — start a task on your terminal, then continue it from your phone.
1372
+
1373
+ ### How It Works
1374
+
1375
+ ```
1376
+ illusion (main program)
1377
+ ├─ Reads channels.json → feishu.enabled / weixin.enabled
1378
+ ├─ Silently spawns 'illusion channel serve' as a background daemon
1379
+ │ └─ Feishu: WS long connection → agent → streaming card reply
1380
+ │ └─ WeChat: HTTP long-poll → agent → typing indicator + text reply
1381
+ └─ run_repl() ← Local terminal interaction (unaffected)
1382
+
1383
+ Your phone
1384
+ └─ Send message → daemon receives → agent processes → reply
1385
+ ```
1386
+
1387
+ ### Supported Channels
1388
+
1389
+ | Channel | Protocol | Streaming | Group Chat | Status |
1390
+ |---------|----------|-----------|------------|--------|
1391
+ | Feishu / Lark | WS long connection | Interactive card (JSON 2.0) | ✅ | Production ready |
1392
+ | WeChat (iLink Bot) | HTTP long-poll | Typing indicator + text | ❌ (DM only) | Production ready |
1393
+
1394
+ ### Quick Start (Feishu)
1395
+
1396
+ #### 1. Create a Feishu App
1397
+
1398
+ 1. Go to [Feishu Open Platform](https://open.feishu.cn/app) (Lark: [open.larksuite.com](https://open.larksuite.com/app))
1399
+ 2. Create a **Custom App** (自建应用)
1400
+ 3. Enable the **Bot** capability (机器人能力)
1401
+ 4. Under **Event Subscriptions** (事件订阅), select **Long Connection mode** (长连接模式)
1402
+ 5. Subscribe to the event: `im.message.receive_v1` (接收消息)
1403
+ 6. Record your **App ID** and **App Secret**
1404
+
1405
+ #### 2. Configure the Channel
1406
+
1407
+ ```bash
1408
+ illusion channel login
1409
+ ```
1410
+
1411
+ This launches an interactive setup wizard:
1412
+
1413
+ ```
1414
+ 选择渠道 / Select a channel:
1415
+ 1. 飞书 / Feishu (Lark)
1416
+ 输入序号: 1
1417
+
1418
+ --- 飞书渠道配置 ---
1419
+ 选择平台 / Select platform:
1420
+ 1. 飞书 (open.feishu.cn)
1421
+ 2. Lark (open.larksuite.com)
1422
+ 输入序号: 1
1423
+
1424
+ 输入 App ID: cli_a1b2c3...
1425
+ 输入 App Secret: 明文输入
1426
+
1427
+ 是否启用群组会话按用户隔离? (Y/n): Y
1428
+ 群组中是否要求 @机器人才响应? (Y/n): Y
1429
+ 是否允许其他机器人消息? (y/N): N
1430
+
1431
+ 正在安装依赖 lark-oapi... ✓
1432
+ 配置已保存,飞书渠道已启用。
1433
+ ```
1434
+
1435
+ - The `lark-oapi` SDK is **automatically installed** on first setup (as an optional dependency)
1436
+ - Credentials are stored in plaintext in `~/.illusion/channels.json` (per requirement, not masked)
1437
+ - The channel is **auto-activated** on next `illusion` launch
1438
+
1439
+ #### 3. Start Using
1440
+
1441
+ ```bash
1442
+ # Option A: Let illusion auto-activate the channel (silent background daemon)
1443
+ illusion # Channel daemon starts automatically, REPL runs normally
1444
+
1445
+ # Option B: Run the daemon in foreground (see logs, Ctrl+C to stop)
1446
+ illusion channel serve
1447
+ ```
1448
+
1449
+ Now send a message to your bot in Feishu — you'll get a streaming card reply with full Markdown rendering.
1450
+
1451
+ ### Channel Configuration (channels.json)
1452
+
1453
+ Channel config is stored separately in `~/.illusion/channels.json` (not in `settings.json`):
1454
+
1455
+ ```json
1456
+ {
1457
+ "feishu": {
1458
+ "enabled": true,
1459
+ "app_id": "cli_xxx",
1460
+ "app_secret": "your-secret",
1461
+ "domain": "feishu",
1462
+ "require_mention": true,
1463
+ "allow_bots": false,
1464
+ "group_sessions_per_user": true,
1465
+ "group_policy": {
1466
+ "mode": "open",
1467
+ "allowlist": [],
1468
+ "blacklist": [],
1469
+ "admin_list": []
1470
+ }
1471
+ }
1472
+ }
1473
+ ```
1474
+
1475
+ | Field | Default | Description |
1476
+ |-------|---------|-------------|
1477
+ | `enabled` | `false` | Whether the channel is active |
1478
+ | `app_id` | — | Feishu App ID |
1479
+ | `app_secret` | — | Feishu App Secret (plaintext) |
1480
+ | `domain` | `"feishu"` | `"feishu"` (China) or `"lark"` (International) |
1481
+ | `require_mention` | `true` | In groups, only respond when @mentioned |
1482
+ | `allow_bots` | `false` | Whether to process messages from other bots |
1483
+ | `group_sessions_per_user` | `true` | Isolate sessions per user in groups |
1484
+ | `group_policy.mode` | `"open"` | `"open"` / `"disabled"` / `"allowlist"` / `"blacklist"` |
1485
+ | `group_policy.allowlist` | `[]` | Allowed chat_ids (when mode=allowlist) |
1486
+ | `group_policy.blacklist` | `[]` | Blocked chat_ids (when mode=blacklist) |
1487
+ | `group_policy.admin_list` | `[]` | user_ids that always bypass policy |
1488
+
1489
+ ### Feishu Slash Commands
1490
+
1491
+ You can manage sessions directly from Feishu chats:
1492
+
1493
+ | Command | Description |
1494
+ |---------|-------------|
1495
+ | `/help` | List available commands |
1496
+ | `/clear` | Clear current Feishu session history |
1497
+ | `/new` | Start a new Feishu session |
1498
+ | `/sessions` | List local terminal sessions (unfinished work) |
1499
+ | `/resume [id\|index]` | Resume a local terminal session into Feishu |
1500
+ | `/detach` | Save current Feishu session as a local terminal session |
1501
+ | `/model [show\|set NAME]` | View or switch the session model |
1502
+
1503
+ **Remote work continuation workflow:**
1504
+ 1. Start a coding task in your terminal, exit midway
1505
+ 2. From Feishu, send `/sessions` — see your unfinished terminal sessions
1506
+ 3. Send `/resume 1` — pull the session into Feishu, continue working
1507
+ 4. Send `/detach` — save it back to local, resume in terminal with `illusion --resume <id>`
1508
+
1509
+ ### Feishu Built-in Tools
1510
+
1511
+ When the Feishu channel is enabled, the agent gains access to Feishu-specific tools:
1512
+
1513
+ | Tool | Description |
1514
+ |------|-------------|
1515
+ | `feishu_doc_read` | Read a Feishu Docx/Wiki document as plain text |
1516
+ | `feishu_doc_create` | Create a new Feishu Docx document |
1517
+ | `feishu_drive_list` | List files in a Feishu Drive folder |
1518
+ | `feishu_drive_upload` | Upload a local file to Feishu Drive |
1519
+ | `feishu_drive_download` | Download a Feishu Drive file to local |
1520
+
1521
+ These tools use the same App credentials and are available to the agent automatically.
1522
+
1523
+ ### Permission Interaction
1524
+
1525
+ When the agent requests permission for a tool (e.g., running a bash command), the request is **pushed to Feishu**:
1526
+
1527
+ ```
1528
+ ⚠️ 工具 bash 请求权限:执行 ls -la
1529
+ 回复 'y' 批准(120s 超时自动拒绝)
1530
+ ```
1531
+
1532
+ Reply `y` to approve, or wait for auto-deny after 120s. Same mechanism applies to `ask_user` questions and plan approvals.
1533
+
1534
+ ### Troubleshooting
1535
+
1536
+ | Problem | Solution |
1537
+ |---------|----------|
1538
+ | No response in Feishu | Check `~/.illusion/channels/serve.log` for errors |
1539
+ | Daemon didn't auto-start | Run `illusion channel status` to check; manually run `illusion channel serve` to see logs |
1540
+ | `processor not found` in logs | Harmless — this is the read-receipt event, already handled with a no-op processor |
1541
+ | Card not rendering tables | Ensure your Feishu client is v7.20+ (JSON 2.0 cards require it) |
1542
+ | WS connection keeps reconnecting | Verify App ID/Secret are correct; check event subscription is set to Long Connection mode |
1543
+ | Edit limit (230072) | Not applicable — cards use `message.patch` which has no edit count limit |
1544
+
1545
+ ### Quick Start (WeChat)
1546
+
1547
+ WeChat uses the **iLink Bot API** (Tencent's official Bot API via HTTPS long-poll). It's not a reverse-engineering hook — no WeChat client needs to be running.
1548
+
1549
+ #### 1. Configure the Channel
1550
+
1551
+ ```bash
1552
+ illusion channel login
1553
+ # Select: 2. WeChat
1554
+ ```
1555
+
1556
+ This will:
1557
+ 1. Auto-install `aiohttp`, `cryptography`, `qrcode` (first time only)
1558
+ 2. Open your browser with a QR code page
1559
+ 3. Scan with WeChat to authorize the bot identity
1560
+ 4. Save credentials to `~/.illusion/channels.json`
1561
+
1562
+ #### 2. Start Using
1563
+
1564
+ ```bash
1565
+ illusion # Auto-activates WeChat daemon in background
1566
+ # or
1567
+ illusion channel serve # Foreground mode with logs
1568
+ ```
1569
+
1570
+ Send a message to your bot in WeChat — you'll see "typing..." indicator, then the full reply.
1571
+
1572
+ #### 3. Key Limitations
1573
+
1574
+ - **DM only** — bot identity cannot join normal WeChat groups
1575
+ - **No message editing** — replies are sent as complete text (typing indicator shows during processing)
1576
+ - **2000 char limit** — longer replies auto-split into multiple messages with 1.5s delay
1577
+ - **Session expires** — if you see `errcode=-14`, re-run `illusion channel login` to re-scan
1578
+
1579
+ ### Channel Architecture
1580
+
1581
+ ```
1582
+ src/illusion/channels/
1583
+ ├── __init__.py # ChannelRunner (message→agent glue) + maybe_spawn_channel_daemon
1584
+ ├── base.py # Channel ABC + InboundMessage + typing methods
1585
+ ├── base_commands.py # BaseCommandHandler (shared slash commands)
1586
+ ├── config.py # ChannelsConfig / FeishuChannelConfig / WeixinChannelConfig
1587
+ ├── serve.py # 'illusion channel serve' entry point (multi-channel)
1588
+ ├── pid.py # PID file management (avoid duplicate daemons)
1589
+ ├── feishu/
1590
+ │ ├── adapter.py # FeishuChannel: WS connection, event dispatch, admission control
1591
+ │ ├── ws_client.py # lark-oapi WS client wrapper
1592
+ │ ├── messaging.py # Card send/patch, message rendering
1593
+ │ ├── stream_editor.py # Streaming card editor (throttled patch updates)
1594
+ │ ├── session_map.py # Feishu session store (chat_id → session)
1595
+ │ └── commands.py # FeishuCommandHandler (extends BaseCommandHandler)
1596
+ ├── weixin/
1597
+ │ ├── __init__.py # WEIXIN_DEPENDENCIES / ensure_weixin_dependencies
1598
+ │ ├── adapter.py # WeixinChannel: long-poll, admission, context_token, typing
1599
+ │ ├── ilink_api.py # iLink Bot API client (QR login / send / poll / typing)
1600
+ │ ├── session_map.py # WeixinSessionStore (user_id → session)
1601
+ │ └── commands.py # WeixinCommandHandler (extends BaseCommandHandler)
1602
+ └── tools/
1603
+ ├── feishu_doc.py # feishu_doc_read / feishu_doc_create
1604
+ └── feishu_drive.py # feishu_drive_list / upload / download
1605
+ ```
1606
+
1607
+ ---
1608
+
1361
1609
  ## 🔌 Extension Development
1362
1610
 
1363
1611
  ### Plugin System