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