illusion-code 0.1.5__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.
- illusion_code-0.2.0/.python-version +1 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/LICENSE +1 -1
- {illusion_code-0.1.5 → illusion_code-0.2.0}/PKG-INFO +260 -6
- {illusion_code-0.1.5 → illusion_code-0.2.0}/README.md +253 -5
- {illusion_code-0.1.5 → illusion_code-0.2.0}/README.zh-CN.md +253 -5
- illusion_code-0.2.0/docs/images/IllusionCode.png +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/package-lock.json +2 -2
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/package.json +1 -1
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/App.tsx +7 -147
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/ModalHost.tsx +175 -61
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/version.ts +1 -1
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/package-lock.json +2 -2
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/package.json +1 -1
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/components/ModalCard.tsx +135 -27
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/version.ts +1 -1
- {illusion_code-0.1.5 → illusion_code-0.2.0}/pyproject.toml +9 -1
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/__init__.py +1 -1
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/api/provider.py +2 -24
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/auth/codex_oauth.py +4 -4
- illusion_code-0.2.0/src/illusion/channels/__init__.py +469 -0
- illusion_code-0.2.0/src/illusion/channels/base.py +141 -0
- illusion_code-0.2.0/src/illusion/channels/base_commands.py +190 -0
- illusion_code-0.2.0/src/illusion/channels/config.py +175 -0
- illusion_code-0.2.0/src/illusion/channels/feishu/__init__.py +43 -0
- illusion_code-0.2.0/src/illusion/channels/feishu/adapter.py +293 -0
- illusion_code-0.2.0/src/illusion/channels/feishu/commands.py +16 -0
- illusion_code-0.2.0/src/illusion/channels/feishu/messaging.py +406 -0
- illusion_code-0.2.0/src/illusion/channels/feishu/session_map.py +219 -0
- illusion_code-0.2.0/src/illusion/channels/feishu/ws_client.py +100 -0
- illusion_code-0.2.0/src/illusion/channels/pid.py +127 -0
- illusion_code-0.2.0/src/illusion/channels/serve.py +214 -0
- illusion_code-0.2.0/src/illusion/channels/tools/__init__.py +8 -0
- illusion_code-0.2.0/src/illusion/channels/tools/feishu_doc.py +148 -0
- illusion_code-0.2.0/src/illusion/channels/tools/feishu_drive.py +226 -0
- illusion_code-0.2.0/src/illusion/channels/weixin/__init__.py +47 -0
- illusion_code-0.2.0/src/illusion/channels/weixin/adapter.py +465 -0
- illusion_code-0.2.0/src/illusion/channels/weixin/commands.py +16 -0
- illusion_code-0.2.0/src/illusion/channels/weixin/ilink_api.py +604 -0
- illusion_code-0.2.0/src/illusion/channels/weixin/session_map.py +163 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/cli.py +298 -13
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/auth.py +2 -2
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/helpers.py +12 -1
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/misc.py +27 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/session.py +24 -9
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/config/i18n.py +63 -2
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/config/paths.py +24 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/config/settings.py +17 -1
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/coordinator/agent_definitions.py +33 -50
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/permissions/checker.py +3 -1
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/swarm/agent_executor.py +3 -12
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/__init__.py +10 -1
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/exit_plan_mode_tool.py +2 -1
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/ui/backend_host.py +38 -36
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/ui/protocol.py +0 -1
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/ui/runtime.py +40 -9
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/ui/web/ws_host.py +37 -33
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/utils/ripgrep.py +10 -2
- illusion_code-0.2.0/tests/channels/feishu/test_adapter.py +193 -0
- illusion_code-0.2.0/tests/channels/feishu/test_commands.py +102 -0
- illusion_code-0.2.0/tests/channels/feishu/test_session_map.py +95 -0
- illusion_code-0.2.0/tests/channels/test_base.py +38 -0
- illusion_code-0.2.0/tests/channels/test_base_commands.py +63 -0
- illusion_code-0.2.0/tests/channels/test_config.py +86 -0
- illusion_code-0.2.0/tests/channels/test_pid.py +73 -0
- illusion_code-0.2.0/tests/channels/test_tool_registration.py +37 -0
- illusion_code-0.2.0/tests/channels/tools/test_feishu_doc.py +60 -0
- illusion_code-0.2.0/tests/channels/tools/test_feishu_drive.py +64 -0
- illusion_code-0.2.0/tests/channels/weixin/test_adapter.py +93 -0
- illusion_code-0.2.0/tests/channels/weixin/test_config.py +45 -0
- illusion_code-0.2.0/tests/channels/weixin/test_ilink_api.py +183 -0
- illusion_code-0.2.0/tests/channels/weixin/test_session_map.py +58 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_config/test_settings.py +18 -5
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_permissions/test_checker.py +34 -0
- illusion_code-0.2.0/tests/test_prompts/__init__.py +0 -0
- illusion_code-0.2.0/tests/test_swarm/__init__.py +0 -0
- illusion_code-0.2.0/tests/test_tools/__init__.py +0 -0
- illusion_code-0.2.0/tests/test_ui/__init__.py +0 -0
- illusion_code-0.1.5/.python-version +0 -1
- illusion_code-0.1.5/src/illusion/skills/bundled/content/coding-guidelines.md +0 -70
- {illusion_code-0.1.5 → illusion_code-0.2.0}/.github/workflows/publish.yml +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/.gitignore +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/docs/images/image1.png +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/docs/images/image2.png +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/build.mjs +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/CommandPicker.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/Composer.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/ComposerController.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/ConversationView.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/Footer.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/MarkdownContent.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/MarkdownTable.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/MultilineTextInput.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/PromptInput.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/SelectModal.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/SidePanel.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/Spinner.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/StatusBar.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/SwarmPanel.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/TodoPanel.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/ToolCallDisplay.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/TranscriptPane.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/components/WelcomeBanner.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/hooks/useAnimationFrame.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/hooks/useBackendSession.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/hooks/useBlink.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/hooks/useTerminalSize.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/i18n.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/index.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/theme/ThemeContext.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/theme/builtinThemes.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/ToolInterface.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/AgentTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/BashTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/CronTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/EditTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/GenericTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/LspTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/McpTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/NotebookTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/PlanTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/ReadTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/SearchTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/SkillTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/TaskTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/WebTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/WorktreeTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/implementations/WriteTool.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/tools/registry.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/types.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/utils/markdown.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/src/utils/thinking.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/terminal/tsconfig.json +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/index.html +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/postcss.config.js +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/App.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/components/ChatArea.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/components/MessageBubble.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/components/PromptInput.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/components/RightPanel.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/components/Sidebar.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/components/TodoPanel.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/components/Toolbar.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/components/WelcomeScreen.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/hooks/useWebSocketSession.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/i18n.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/index.css +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/main.tsx +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/remarkSuperscript.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/types/protocol.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/src/vite-env.d.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/tailwind.config.js +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/tsconfig.json +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/tsconfig.node.json +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/frontend/web/vite.config.ts +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/scripts/build_frontend.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/scripts/hatch_build.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/scripts/publish.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/scripts/sync_version.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/__main__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/api/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/api/client.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/api/codex_client.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/api/compat.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/api/effort.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/api/errors.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/api/openai_client.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/api/registry.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/api/usage.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/auth/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/auth/copilot.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/auth/external.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/auth/flows.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/auth/manager.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/auth/storage.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/bridge/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/bridge/manager.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/bridge/session_runner.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/bridge/types.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/bridge/work_secret.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/bridge.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/context.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/git.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/analysis/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/analysis/architecture.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/analysis/conventions.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/analysis/dependencies.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/analysis/key_modules.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/extraction/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/extraction/lsp_symbols.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/extraction/readme.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/extraction/scanner.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/generation/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/generation/claudemd.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/generation/illusionmd.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/generation/memory_template.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/generation/rules.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/generation/sections.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/orchestrator.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/init/types.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/mcp.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/memory.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/model.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/plugin.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/registry.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/rules.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/sandbox.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/settings.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/commands/types.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/config/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/config/plan_file.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/coordinator/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/coordinator/coordinator_mode.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/engine/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/engine/cost_tracker.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/engine/messages.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/engine/query.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/engine/query_engine.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/engine/stream_events.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/hooks/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/hooks/events.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/hooks/executor.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/hooks/hot_reload.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/hooks/loader.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/hooks/register_hooks.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/hooks/schemas.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/hooks/session_hooks.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/hooks/types.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/hooks/utils.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/mcp/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/mcp/client.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/mcp/config.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/mcp/types.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/memory/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/memory/manager.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/memory/memdir.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/memory/paths.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/memory/scan.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/memory/search.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/memory/types.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/output_styles/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/output_styles/loader.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/permissions/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/permissions/modes.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/platforms.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/plugins/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/plugins/installer.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/plugins/loader.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/plugins/options.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/plugins/schemas.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/plugins/types.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/prompts/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/prompts/claudemd.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/prompts/context.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/prompts/environment.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/prompts/system_prompt.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/sandbox/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/sandbox/adapter.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/sandbox/platforms/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/sandbox/platforms/base.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/sandbox/platforms/linux.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/sandbox/platforms/macos.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/sandbox/platforms/windows.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/sandbox/proxy/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/sandbox/proxy/env_vars.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/sandbox/runtime.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/sandbox/symlink_protection.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/sandbox/utils.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/sandbox/violation_store.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/compact/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/compact/auto_compact.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/compact/compact_core.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/compact/compact_prompt.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/compact/constants.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/compact/message_ops.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/compact/microcompact.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/compact/models.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/compact/token_utils.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/cron.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/cron_scheduler.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/file_history.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/lsp/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/lsp/client.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/lsp/config.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/lsp/manager.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/lsp/types.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/session_storage.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/services/token_estimation.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/skills/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/skills/bundled/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/batch.md +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/debug.md +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/loop.md +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/remember.md +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/simplify.md +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/skillify.md +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/stuck.md +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/update-config.md +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/skills/bundled/content/verify.md +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/skills/loader.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/skills/registry.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/skills/types.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/state/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/state/app_state.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/state/store.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/swarm/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/swarm/in_process.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/swarm/subprocess_backend.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/swarm/team_helpers.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/swarm/types.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/swarm/worktree.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tasks/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tasks/local_agent_task.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tasks/local_shell_task.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tasks/manager.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tasks/stop_task.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tasks/types.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/agent_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/ask_user_question_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/base.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/bash_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/config_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/cron_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/enter_plan_mode_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/enter_worktree_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/exit_worktree_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/file_edit_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/file_read_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/file_write_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/glob_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/grep_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/list_mcp_resources_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/lsp_formatters.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/lsp_schemas.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/lsp_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/mcp_auth_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/mcp_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/notebook_edit_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/powershell_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/read_mcp_resource_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/repl_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/send_message_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/shell_common.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/skill_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/sleep_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/structured_output_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/task_create_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/task_get_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/task_list_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/task_output_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/task_stop_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/task_update_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/team_create_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/team_delete_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/todo_write_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/tool_search_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/web_fetch_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/tools/web_search_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/ui/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/ui/app.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/ui/input.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/ui/output.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/ui/permission_dialog.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/ui/permission_store.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/ui/react_launcher.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/ui/textual_app.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/ui/web/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/ui/web/server.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/utils/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/src/illusion/utils/shell.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/api/test_anthropic_client.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/api/test_client.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/api/test_codex_client.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/api/test_effort.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/api/test_fallback/346/217/220/347/244/272.py" +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/api/test_openai_client.py +0 -0
- {illusion_code-0.1.5/tests/commands/init → illusion_code-0.2.0/tests/channels}/__init__.py +0 -0
- {illusion_code-0.1.5/tests/test_api → illusion_code-0.2.0/tests/channels/feishu}/__init__.py +0 -0
- {illusion_code-0.1.5/tests/test_commands → illusion_code-0.2.0/tests/channels/tools}/__init__.py +0 -0
- {illusion_code-0.1.5/tests/test_config → illusion_code-0.2.0/tests/channels/weixin}/__init__.py +0 -0
- {illusion_code-0.1.5/tests/test_engine → illusion_code-0.2.0/tests/commands/init}/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/commands/init/test_claudemd.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/commands/init/test_orchestrator.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/commands/init/test_scanner.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/commands/init/test_sections.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/commands/test_effort_command.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/config/test_i18n.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/config/test_settings.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/conftest.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/engine/test_query_engine.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/fixtures/fake_mcp_server.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/integration/test_effort_integration.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/services/lsp/test_lsp_client.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/services/lsp/test_lsp_config.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/services/lsp/test_lsp_manager.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/services/lsp/test_lsp_types.py +0 -0
- {illusion_code-0.1.5/tests/test_hooks → illusion_code-0.2.0/tests/test_api}/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_api/test_client.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_api/test_codex_client.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_api/test_compat.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_api/test_openai_client.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_auth/test_external.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_bridge/test_core.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_bridge/test_session_flow.py +0 -0
- {illusion_code-0.1.5/tests/test_mcp → illusion_code-0.2.0/tests/test_commands}/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_commands/test_cli.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_commands/test_command_flows.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_commands/test_registry.py +0 -0
- {illusion_code-0.1.5/tests/test_memory → illusion_code-0.2.0/tests/test_config}/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_config/test_paths.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_coordinator/test_agent_definitions.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_coordinator/test_coordinator_mode.py +0 -0
- {illusion_code-0.1.5/tests/test_permissions → illusion_code-0.2.0/tests/test_engine}/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_engine/test_media_block.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_engine/test_query_engine.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_engine/test_tool_result_media.py +0 -0
- {illusion_code-0.1.5/tests/test_plugins → illusion_code-0.2.0/tests/test_hooks}/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_hooks/test_executor.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_hooks_skills_plugins_real.py +0 -0
- {illusion_code-0.1.5/tests/test_prompts → illusion_code-0.2.0/tests/test_mcp}/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_mcp/test_integration.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_mcp/test_stdio_flow.py +0 -0
- {illusion_code-0.1.5/tests/test_swarm → illusion_code-0.2.0/tests/test_memory}/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_memory/test_memdir.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_merged_prs_on_autoagent.py +0 -0
- {illusion_code-0.1.5/tests/test_tools → illusion_code-0.2.0/tests/test_permissions}/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_platforms.py +0 -0
- {illusion_code-0.1.5/tests/test_ui → illusion_code-0.2.0/tests/test_plugins}/__init__.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_plugins/test_lifecycle_flow.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_plugins/test_loader.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_prompts/test_claudemd.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_prompts/test_environment.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_prompts/test_system_prompt.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_real_large_tasks.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_sandbox/test_adapter.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_sandbox/test_config_schema.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_sandbox/test_platform_linux.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_sandbox/test_platform_macos.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_sandbox/test_platform_windows.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_sandbox/test_proxy_env_vars.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_sandbox/test_runtime.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_sandbox/test_symlink_protection.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_sandbox/test_utils.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_sandbox/test_violation_store.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_scripts/test_sync_version.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_services/test_compact.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_services/test_cron.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_services/test_cron_scheduler.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_services/test_session_storage.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_skills/test_loader.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_swarm/test_agent_executor.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_swarm/test_imports.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_swarm/test_in_process.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_swarm/test_types.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_swarm/test_worktree.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_tasks/test_manager.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_tools/test_agent_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_tools/test_core_tools.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_tools/test_file_read_media.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_tools/test_glob_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_tools/test_grep_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_tools/test_integration.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_tools/test_integration_flows.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_tools/test_mcp_auth_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_tools/test_ripgrep.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_tools/test_shell_common.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_tools/test_task_tools.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_tools/test_team_tools.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_tools/test_web_fetch_tool.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_ui/test_modes.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_ui/test_permission_store.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_ui/test_react_backend.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_ui/test_react_launcher.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_ui/test_textual_app.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_untested_features.py +0 -0
- {illusion_code-0.1.5 → illusion_code-0.2.0}/tests/test_utils/test_shell.py +0 -0
- {illusion_code-0.1.5 → 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
|
Metadata-Version: 2.4
|
|
2
2
|
Name: illusion-code
|
|
3
|
-
Version: 0.
|
|
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=
|
|
96
|
-
<img src="docs/images/
|
|
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=
|
|
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
|
|
@@ -127,7 +133,7 @@ IllusionCode is an open-source AI-powered command-line programming assistant tha
|
|
|
127
133
|
### Requirements
|
|
128
134
|
|
|
129
135
|
- Python >= 3.10
|
|
130
|
-
- Node.js
|
|
136
|
+
- Node.js 18+
|
|
131
137
|
- Supports Windows, macOS, Linux
|
|
132
138
|
- Windows users: Auto-detect Git, no manual PATH configuration needed
|
|
133
139
|
|
|
@@ -141,7 +147,7 @@ The simplest way to install IllusionCode. Automatically installs both frontends
|
|
|
141
147
|
pip install illusion-code
|
|
142
148
|
```
|
|
143
149
|
|
|
144
|
-
No git clone
|
|
150
|
+
No git clone required — everything is included in the package.
|
|
145
151
|
|
|
146
152
|
#### Alternative: pip install from source
|
|
147
153
|
|
|
@@ -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=
|
|
48
|
-
<img src="docs/images/
|
|
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=
|
|
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
|
|
@@ -79,7 +79,7 @@ IllusionCode is an open-source AI-powered command-line programming assistant tha
|
|
|
79
79
|
### Requirements
|
|
80
80
|
|
|
81
81
|
- Python >= 3.10
|
|
82
|
-
- Node.js
|
|
82
|
+
- Node.js 18+
|
|
83
83
|
- Supports Windows, macOS, Linux
|
|
84
84
|
- Windows users: Auto-detect Git, no manual PATH configuration needed
|
|
85
85
|
|
|
@@ -93,7 +93,7 @@ The simplest way to install IllusionCode. Automatically installs both frontends
|
|
|
93
93
|
pip install illusion-code
|
|
94
94
|
```
|
|
95
95
|
|
|
96
|
-
No git clone
|
|
96
|
+
No git clone required — everything is included in the package.
|
|
97
97
|
|
|
98
98
|
#### Alternative: pip install from source
|
|
99
99
|
|
|
@@ -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
|