illusion-code 0.2.10__tar.gz → 0.2.12__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.10 → illusion_code-0.2.12}/PKG-INFO +1 -1
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/package-lock.json +2 -2
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/package.json +1 -1
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/version.ts +1 -1
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/package-lock.json +2 -2
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/package.json +1 -1
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/version.ts +1 -1
- {illusion_code-0.2.10 → illusion_code-0.2.12}/pyproject.toml +1 -1
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/__init__.py +1 -1
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/__init__.py +70 -142
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/config.py +17 -7
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/delivery.py +280 -127
- illusion_code-0.2.12/src/illusion/channels/exit_handler.py +37 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/feishu/session_map.py +25 -15
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/feishu/ws_client.py +22 -3
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/qq/adapter.py +39 -34
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/qq/session_map.py +22 -12
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/qq/ws_client.py +73 -18
- illusion_code-0.2.12/src/illusion/channels/registry.py +253 -0
- illusion_code-0.2.12/src/illusion/channels/serve.py +361 -0
- illusion_code-0.2.12/src/illusion/channels/tools/cross_channel.py +332 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/tools/feishu_doc.py +6 -6
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/tools/feishu_drive.py +9 -9
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/tools/media.py +5 -1
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/weixin/ilink_api.py +93 -14
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/weixin/session_map.py +22 -12
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/cli.py +70 -56
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/session.py +2 -18
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/config/i18n.py +30 -6
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/hooks/__init__.py +1 -1
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/mcp/__init__.py +1 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/plugins/__init__.py +7 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/prompts/channel_hints.py +9 -1
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/cron.py +3 -3
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/cron_scheduler.py +110 -39
- illusion_code-0.2.12/src/illusion/services/cron_serve.py +141 -0
- illusion_code-0.2.12/src/illusion/services/cron_spawn.py +137 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/skills/__init__.py +6 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tasks/todo_sync.py +2 -2
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/cron_tool.py +51 -15
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/ui/runtime.py +1 -1
- illusion_code-0.2.12/src/illusion/utils/ref_count.py +199 -0
- illusion_code-0.2.12/tests/channels/test_channel_daemon_deprecated.py +57 -0
- illusion_code-0.2.12/tests/channels/test_exit_handler.py +61 -0
- illusion_code-0.2.12/tests/channels/test_registry.py +248 -0
- illusion_code-0.2.12/tests/channels/test_session_persist.py +72 -0
- illusion_code-0.2.12/tests/channels/test_supervise.py +71 -0
- illusion_code-0.2.12/tests/channels/weixin/test_ilink_retry.py +65 -0
- illusion_code-0.2.12/tests/test_cli_exit_handler.py +48 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_services/test_cron_scheduler.py +46 -1
- illusion_code-0.2.12/tests/test_services/test_cron_serve.py +109 -0
- illusion_code-0.2.12/tests/test_services/test_cron_spawn.py +101 -0
- illusion_code-0.2.12/tests/test_utils/test_ref_count.py +138 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/unit/test_delivery.py +54 -23
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/unit/test_qq_streaming.py +2 -2
- illusion_code-0.2.10/src/illusion/channels/serve.py +0 -282
- illusion_code-0.2.10/src/illusion/channels/tools/cross_channel.py +0 -231
- {illusion_code-0.2.10 → illusion_code-0.2.12}/.github/workflows/publish.yml +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/.gitignore +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/.python-version +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/LICENSE +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/README.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/README.zh-CN.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/en/architecture.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/en/channels.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/en/commands.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/en/extensions.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/en/getting-started.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/en/introduction.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/en/project-files.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/en/settings.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/images/IllusionCode.png +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/images/image1.png +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/images/image2.png +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/zh-CN/architecture.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/zh-CN/channels.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/zh-CN/commands.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/zh-CN/extensions.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/zh-CN/getting-started.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/zh-CN/introduction.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/zh-CN/project-files.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/docs/zh-CN/settings.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/build.mjs +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/App.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/CommandPicker.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/Composer.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/ComposerController.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/ConversationView.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/Footer.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/MarkdownContent.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/MarkdownTable.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/ModalHost.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/MultilineTextInput.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/PromptInput.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/QuestionNavigationBar.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/QuestionPreviewBox.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/SelectModal.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/SidePanel.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/Spinner.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/StatusBar.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/SwarmPanel.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/TodoPanel.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/ToolCallDisplay.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/TranscriptPane.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/components/WelcomeBanner.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/hooks/useAnimationFrame.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/hooks/useBackendSession.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/hooks/useBlink.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/hooks/useQuestionState.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/hooks/useTerminalSize.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/i18n.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/index.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/theme/ThemeContext.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/theme/builtinThemes.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/ToolInterface.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/AgentTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/BashTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/CronTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/EditTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/GenericTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/LspTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/McpTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/NotebookTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/PlanTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/ReadTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/SearchTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/SkillTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/TaskTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/WebTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/WorktreeTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/implementations/WriteTool.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/tools/registry.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/types.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/utils/markdown.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/src/utils/thinking.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/terminal/tsconfig.json +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/index.html +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/postcss.config.js +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/App.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/components/ChatArea.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/components/ErrorBoundary.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/components/MessageBubble.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/components/ModalCard.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/components/PromptInput.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/components/RightPanel.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/components/Sidebar.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/components/TodoPanel.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/components/Toolbar.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/components/WelcomeScreen.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/hooks/useTheme.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/hooks/useWebSocketSession.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/i18n.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/index.css +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/main.tsx +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/remarkSuperscript.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/types/protocol.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/utils/toolDisplayName.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/src/vite-env.d.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/tailwind.config.js +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/tsconfig.json +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/tsconfig.node.json +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/frontend/web/vite.config.ts +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/scripts/build_frontend.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/scripts/hatch_build.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/scripts/publish.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/scripts/sync_version.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/__main__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/api/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/api/client.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/api/codex_client.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/api/compat.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/api/effort.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/api/errors.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/api/openai_client.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/api/provider.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/api/registry.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/api/usage.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/auth/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/auth/codex_oauth.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/auth/copilot.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/auth/external.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/auth/flows.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/auth/manager.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/auth/storage.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/bridge/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/bridge/manager.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/bridge/session_runner.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/bridge/types.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/bridge/work_secret.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/base.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/base_commands.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/feishu/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/feishu/adapter.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/feishu/commands.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/feishu/messaging.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/feishu/streaming.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/pid.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/qq/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/qq/api.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/qq/commands.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/qq/streaming.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/tools/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/weixin/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/weixin/adapter.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/channels/weixin/commands.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/auth.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/bridge.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/context.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/git.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/helpers.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/analysis/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/analysis/architecture.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/analysis/conventions.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/analysis/dependencies.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/analysis/key_modules.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/extraction/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/extraction/lsp_symbols.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/extraction/readme.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/extraction/scanner.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/generation/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/generation/claudemd.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/generation/illusionmd.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/generation/memory_template.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/generation/rules.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/generation/sections.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/orchestrator.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/init/types.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/mcp.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/memory.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/misc.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/model.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/plugin.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/registry.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/rules.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/sandbox.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/settings.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/commands/types.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/config/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/config/paths.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/config/plan_file.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/config/settings.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/coordinator/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/coordinator/agent_definitions.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/coordinator/coordinator_mode.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/engine/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/engine/cost_tracker.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/engine/messages.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/engine/query.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/engine/query_engine.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/engine/stream_events.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/hooks/events.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/hooks/executor.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/hooks/hot_reload.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/hooks/loader.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/hooks/register_hooks.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/hooks/schemas.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/hooks/session_hooks.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/hooks/types.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/hooks/utils.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/mcp/client.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/mcp/config.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/mcp/types.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/memory/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/memory/manager.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/memory/memdir.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/memory/paths.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/memory/scan.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/memory/search.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/memory/types.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/output_styles/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/output_styles/loader.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/permissions/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/permissions/checker.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/permissions/loader.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/permissions/modes.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/permissions/schemas.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/platforms.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/plugins/installer.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/plugins/loader.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/plugins/options.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/plugins/schemas.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/plugins/types.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/prompts/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/prompts/claudemd.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/prompts/context.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/prompts/environment.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/prompts/system_prompt.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/sandbox/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/sandbox/adapter.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/sandbox/platforms/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/sandbox/platforms/base.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/sandbox/platforms/linux.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/sandbox/platforms/macos.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/sandbox/platforms/windows.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/sandbox/proxy/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/sandbox/proxy/env_vars.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/sandbox/runtime.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/sandbox/symlink_protection.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/sandbox/utils.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/sandbox/violation_store.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/compact/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/compact/auto_compact.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/compact/compact_core.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/compact/compact_prompt.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/compact/constants.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/compact/message_ops.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/compact/microcompact.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/compact/models.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/compact/token_utils.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/file_history.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/lsp/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/lsp/client.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/lsp/config.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/lsp/manager.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/lsp/types.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/session_storage.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/services/token_estimation.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/skills/bundled/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/skills/bundled/content/batch.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/skills/bundled/content/debug.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/skills/bundled/content/loop.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/skills/bundled/content/remember.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/skills/bundled/content/simplify.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/skills/bundled/content/skillify.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/skills/bundled/content/stuck.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/skills/bundled/content/update-config.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/skills/bundled/content/verify.md +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/skills/loader.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/skills/registry.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/skills/types.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/state/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/state/app_state.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/state/store.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/swarm/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/swarm/agent_executor.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/swarm/in_process.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/swarm/subprocess_backend.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/swarm/team_helpers.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/swarm/types.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/swarm/worktree.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tasks/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tasks/local_agent_task.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tasks/local_shell_task.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tasks/manager.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tasks/stop_task.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tasks/types.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/agent_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/ask_user_question_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/base.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/bash_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/config_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/enter_plan_mode_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/enter_worktree_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/exit_plan_mode_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/exit_worktree_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/file_edit_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/file_read_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/file_write_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/glob_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/grep_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/list_mcp_resources_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/lsp_formatters.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/lsp_schemas.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/lsp_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/mcp_auth_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/mcp_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/notebook_edit_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/powershell_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/read_mcp_resource_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/repl_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/send_message_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/shell_common.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/skill_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/sleep_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/structured_output_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/task_create_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/task_get_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/task_list_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/task_output_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/task_stop_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/task_update_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/team_create_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/team_delete_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/todo_write_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/tool_search_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/web_fetch_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/tools/web_search_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/ui/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/ui/app.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/ui/backend_host.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/ui/input.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/ui/output.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/ui/permission_dialog.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/ui/permission_store.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/ui/protocol.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/ui/react_launcher.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/ui/textual_app.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/ui/web/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/ui/web/server.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/ui/web/ws_host.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/ui/web/ws_web_api.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/utils/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/utils/atomic_write.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/utils/file_state_cache.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/utils/ripgrep.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/src/illusion/utils/shell.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/api/test_anthropic_client.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/api/test_client.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/api/test_codex_client.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/api/test_effort.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/api/test_fallback/346/217/220/347/244/272.py" +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/api/test_openai_client.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/feishu/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/feishu/test_adapter.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/feishu/test_commands.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/feishu/test_session_map.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/test_base.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/test_base_commands.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/test_config.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/test_pid.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/test_tool_registration.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/tools/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/tools/test_feishu_doc.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/tools/test_feishu_drive.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/weixin/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/weixin/test_adapter.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/weixin/test_config.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/weixin/test_ilink_api.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/channels/weixin/test_session_map.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/commands/init/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/commands/init/test_claudemd.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/commands/init/test_orchestrator.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/commands/init/test_scanner.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/commands/init/test_sections.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/commands/test_effort_command.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/config/test_i18n.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/config/test_settings.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/conftest.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/engine/test_query_engine.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/fixtures/fake_mcp_server.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/integration/test_effort_integration.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/services/lsp/test_lsp_client.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/services/lsp/test_lsp_config.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/services/lsp/test_lsp_manager.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/services/lsp/test_lsp_types.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_api/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_api/test_client.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_api/test_codex_client.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_api/test_compat.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_api/test_openai_client.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_auth/test_external.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_bridge/test_core.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_bridge/test_session_flow.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_commands/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_commands/test_cli.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_commands/test_command_flows.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_commands/test_registry.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_config/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_config/test_paths.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_config/test_settings.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_coordinator/test_agent_definitions.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_coordinator/test_coordinator_mode.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_engine/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_engine/test_media_block.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_engine/test_query_engine.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_engine/test_tool_result_media.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_hooks/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_hooks/test_executor.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_hooks/test_loader_permissions.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_hooks_skills_plugins_real.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_mcp/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_mcp/test_config_permissions.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_mcp/test_integration.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_mcp/test_stdio_flow.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_memory/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_memory/test_manager_permissions.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_memory/test_memdir.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_merged_prs_on_autoagent.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_permissions/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_permissions/test_checker.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_permissions/test_loader.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_permissions/test_project_permissions.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_platforms.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_plugins/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_plugins/test_lifecycle_flow.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_plugins/test_loader.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_plugins/test_loader_permissions.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_prompts/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_prompts/test_claudemd.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_prompts/test_claudemd_permissions.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_prompts/test_environment.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_prompts/test_system_prompt.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_qq_channel.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_real_large_tasks.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_sandbox/test_adapter.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_sandbox/test_config_schema.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_sandbox/test_platform_linux.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_sandbox/test_platform_macos.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_sandbox/test_platform_windows.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_sandbox/test_proxy_env_vars.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_sandbox/test_runtime.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_sandbox/test_symlink_protection.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_sandbox/test_utils.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_sandbox/test_violation_store.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_scripts/test_sync_version.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_services/test_compact.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_services/test_cron.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_services/test_session_storage.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_skills/test_loader.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_skills/test_loader_permissions.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_swarm/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_swarm/test_agent_executor.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_swarm/test_imports.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_swarm/test_in_process.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_swarm/test_types.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_swarm/test_worktree.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_tasks/test_manager.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_tools/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_tools/test_agent_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_tools/test_core_tools.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_tools/test_file_read_media.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_tools/test_glob_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_tools/test_grep_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_tools/test_integration.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_tools/test_integration_flows.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_tools/test_mcp_auth_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_tools/test_ripgrep.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_tools/test_shell_common.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_tools/test_task_tools.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_tools/test_team_tools.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_tools/test_web_fetch_tool.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_ui/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_ui/test_modes.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_ui/test_permission_store.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_ui/test_react_backend.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_ui/test_react_launcher.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_ui/test_textual_app.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_untested_features.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/test_utils/test_shell.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/ui/test_backend_host.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/ui/test_protocol_web.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/ui/test_web_api.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/unit/__init__.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/unit/test_channel_hints.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/unit/test_cross_channel.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/unit/test_feishu_streaming.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/unit/test_media_tools.py +0 -0
- {illusion_code-0.2.10 → illusion_code-0.2.12}/tests/unit/test_session_list_active.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.12
|
|
4
4
|
Summary: Open-source Python port of Claude Code - an AI-powered CLI coding assistant
|
|
5
5
|
Project-URL: Homepage, https://github.com/YunTaiHua/illusion-code
|
|
6
6
|
Project-URL: Repository, https://github.com/YunTaiHua/illusion-code
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@illusion/terminal",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.12",
|
|
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.12",
|
|
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.12",
|
|
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.12",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"highlight.js": "^11.11.0",
|
|
12
12
|
"react": "^18.3.1",
|
|
@@ -21,6 +21,7 @@ from typing import TYPE_CHECKING, Any, cast
|
|
|
21
21
|
|
|
22
22
|
from illusion.channels.config import load_channels_config
|
|
23
23
|
from illusion.utils.atomic_write import atomic_write_text
|
|
24
|
+
from illusion.utils.ref_count import add_ref
|
|
24
25
|
|
|
25
26
|
if TYPE_CHECKING:
|
|
26
27
|
from illusion.channels.base import Channel, InboundMessage
|
|
@@ -35,6 +36,8 @@ logger = logging.getLogger(__name__)
|
|
|
35
36
|
def _config_fingerprint(cfg: "ChannelsConfig") -> str:
|
|
36
37
|
"""计算渠道配置指纹(用于检测配置变更后重启守护进程)
|
|
37
38
|
|
|
39
|
+
遍历 ChannelRegistry,对每个已启用渠道调用其 fingerprint_factory 生成标识。
|
|
40
|
+
|
|
38
41
|
Args:
|
|
39
42
|
cfg: 渠道配置
|
|
40
43
|
|
|
@@ -44,14 +47,14 @@ def _config_fingerprint(cfg: "ChannelsConfig") -> str:
|
|
|
44
47
|
import hashlib
|
|
45
48
|
import json as _json
|
|
46
49
|
|
|
47
|
-
|
|
50
|
+
from illusion.channels.registry import ChannelRegistry
|
|
51
|
+
|
|
52
|
+
# 遍历 registry 调用各渠道的 fingerprint_factory
|
|
48
53
|
enabled_channels = []
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if cfg.qq.enabled:
|
|
54
|
-
enabled_channels.append(f"qq:{cfg.qq.app_id}:{cfg.qq.client_secret}")
|
|
54
|
+
for desc in ChannelRegistry.all_descriptors():
|
|
55
|
+
channel_cfg = getattr(cfg, desc.config_attr, None)
|
|
56
|
+
if channel_cfg is not None and channel_cfg.enabled:
|
|
57
|
+
enabled_channels.append(desc.fingerprint_factory(channel_cfg))
|
|
55
58
|
raw = _json.dumps(sorted(enabled_channels), ensure_ascii=False)
|
|
56
59
|
return hashlib.md5(raw.encode()).hexdigest()
|
|
57
60
|
|
|
@@ -86,7 +89,9 @@ def maybe_spawn_channel_daemon() -> subprocess.Popen[bytes] | None:
|
|
|
86
89
|
except (FileNotFoundError, OSError):
|
|
87
90
|
pass
|
|
88
91
|
if stored_fp == current_fp:
|
|
89
|
-
|
|
92
|
+
# 配置未变,跳过 spawn,但追加引用
|
|
93
|
+
add_ref(data_dir / "daemon.refs", os.getpid())
|
|
94
|
+
return None
|
|
90
95
|
|
|
91
96
|
# 配置已变,终止旧守护进程后重启(is_running 已确认存活)
|
|
92
97
|
from illusion.channels.pid import read_pid
|
|
@@ -138,6 +143,7 @@ def maybe_spawn_channel_daemon() -> subprocess.Popen[bytes] | None:
|
|
|
138
143
|
)
|
|
139
144
|
pid_file.acquire(proc.pid)
|
|
140
145
|
atomic_write_text(fingerprint_path, current_fp)
|
|
146
|
+
add_ref(data_dir / "daemon.refs", os.getpid())
|
|
141
147
|
return proc
|
|
142
148
|
except OSError as exc:
|
|
143
149
|
logger.warning("启动渠道守护进程失败: %s", exc)
|
|
@@ -145,32 +151,23 @@ def maybe_spawn_channel_daemon() -> subprocess.Popen[bytes] | None:
|
|
|
145
151
|
|
|
146
152
|
|
|
147
153
|
def kill_channel_daemon(proc: "subprocess.Popen[bytes] | None") -> None:
|
|
148
|
-
"""
|
|
149
|
-
|
|
150
|
-
供主命令(`illusion`)和 web 命令(`illusion web`)在退出时调用,
|
|
151
|
-
确保 ctrl+c / 正常退出后清理守护进程,避免孤儿进程。
|
|
154
|
+
"""已废弃的渠道守护进程终止函数(noop)
|
|
152
155
|
|
|
153
|
-
|
|
156
|
+
.. deprecated::
|
|
157
|
+
此函数为向后兼容保留。新方案采用引用计数:
|
|
158
|
+
主程序退出时调用 remove_ref,守护进程自监控 refs 为空时自动退出。
|
|
159
|
+
不再需要主动 kill 守护进程。
|
|
154
160
|
|
|
155
161
|
Args:
|
|
156
|
-
proc:
|
|
162
|
+
proc: 已废弃,忽略不处理
|
|
157
163
|
"""
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
except Exception: # noqa: BLE001
|
|
166
|
-
pass
|
|
167
|
-
finally:
|
|
168
|
-
try:
|
|
169
|
-
from illusion.channels.pid import PidFile
|
|
170
|
-
from illusion.config.paths import get_channels_data_dir
|
|
171
|
-
PidFile(get_channels_data_dir() / "daemon.pid").release()
|
|
172
|
-
except Exception: # noqa: BLE001
|
|
173
|
-
pass
|
|
164
|
+
import warnings
|
|
165
|
+
warnings.warn(
|
|
166
|
+
"kill_channel_daemon() 已废弃,请使用 remove_ref + 引用计数机制",
|
|
167
|
+
DeprecationWarning,
|
|
168
|
+
stacklevel=2,
|
|
169
|
+
)
|
|
170
|
+
return
|
|
174
171
|
|
|
175
172
|
|
|
176
173
|
def is_channel_daemon_running() -> bool:
|
|
@@ -178,6 +175,10 @@ def is_channel_daemon_running() -> bool:
|
|
|
178
175
|
|
|
179
176
|
用于退出时判断是否需要询问用户是否一同退出渠道。
|
|
180
177
|
|
|
178
|
+
Note:
|
|
179
|
+
新方案采用引用计数后,此函数仅用于诊断/查询。
|
|
180
|
+
退出处理已改为 remove_ref + 自监控,不再依赖此函数。
|
|
181
|
+
|
|
181
182
|
Returns:
|
|
182
183
|
bool: 守护进程在运行返回 True
|
|
183
184
|
"""
|
|
@@ -188,51 +189,23 @@ def is_channel_daemon_running() -> bool:
|
|
|
188
189
|
|
|
189
190
|
|
|
190
191
|
def stop_channel_daemon_by_pid() -> bool:
|
|
191
|
-
"""
|
|
192
|
-
|
|
193
|
-
供退出时交互式确认使用:无论当前进程是否是 spawn 者,
|
|
194
|
-
都可以通过 PID 文件停止守护进程。
|
|
192
|
+
"""已废弃的渠道守护进程停止函数(noop)
|
|
195
193
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
194
|
+
.. deprecated::
|
|
195
|
+
此函数为向后兼容保留。新方案采用引用计数:
|
|
196
|
+
守护进程通过自监控 refs 为空时自动退出,
|
|
197
|
+
不再需要通过 PID 主动停止。
|
|
199
198
|
|
|
200
199
|
Returns:
|
|
201
|
-
bool:
|
|
200
|
+
bool: 始终返回 False
|
|
202
201
|
"""
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
old_pid = read_pid(pid_file.path)
|
|
212
|
-
if old_pid is not None:
|
|
213
|
-
try:
|
|
214
|
-
if os.name == "nt":
|
|
215
|
-
# Windows: 用 taskkill /T /F 终止整个进程树
|
|
216
|
-
# /T = 终止子进程,/F = 强制终止
|
|
217
|
-
import subprocess as _sp
|
|
218
|
-
_sp.run(
|
|
219
|
-
["taskkill", "/PID", str(old_pid), "/T", "/F"],
|
|
220
|
-
capture_output=True, timeout=5,
|
|
221
|
-
)
|
|
222
|
-
else:
|
|
223
|
-
# Unix: 用 SIGTERM 终止进程组
|
|
224
|
-
import signal
|
|
225
|
-
os.kill(old_pid, signal.SIGTERM)
|
|
226
|
-
except (OSError, ProcessLookupError, Exception): # noqa: BLE001
|
|
227
|
-
pass
|
|
228
|
-
# 等待进程退出,最多 3 秒
|
|
229
|
-
for _ in range(30):
|
|
230
|
-
if not pid_file.is_running():
|
|
231
|
-
break
|
|
232
|
-
import time as _time
|
|
233
|
-
_time.sleep(0.1)
|
|
234
|
-
pid_file.release()
|
|
235
|
-
return True
|
|
202
|
+
import warnings
|
|
203
|
+
warnings.warn(
|
|
204
|
+
"stop_channel_daemon_by_pid() 已废弃,请使用 remove_ref + 引用计数机制",
|
|
205
|
+
DeprecationWarning,
|
|
206
|
+
stacklevel=2,
|
|
207
|
+
)
|
|
208
|
+
return False
|
|
236
209
|
|
|
237
210
|
|
|
238
211
|
class ChannelRunner:
|
|
@@ -318,23 +291,6 @@ class ChannelRunner:
|
|
|
318
291
|
Args:
|
|
319
292
|
msg: 入站消息
|
|
320
293
|
"""
|
|
321
|
-
# 检查 /delete 信号:先执行 /new(清所有会话+发确认),再处理消息
|
|
322
|
-
# 信号触发后直接 return,避免继续走 try_handle 处理 /new 命令
|
|
323
|
-
# 导致"已开启新的对话"反馈消息发送两次
|
|
324
|
-
if self.session_store.check_signal():
|
|
325
|
-
for path in self.session_store.data_dir.glob("*.json"):
|
|
326
|
-
try:
|
|
327
|
-
path.unlink()
|
|
328
|
-
except OSError:
|
|
329
|
-
pass
|
|
330
|
-
from illusion.config.i18n import t as _t
|
|
331
|
-
# 统一使用 cmd_new,避免渠道专属文案不一致
|
|
332
|
-
await self.channel.send_text(
|
|
333
|
-
msg.chat_id, _t("cmd_new"), reply_to=msg.message_id,
|
|
334
|
-
)
|
|
335
|
-
self.session_store.clear_signal()
|
|
336
|
-
return
|
|
337
|
-
|
|
338
294
|
# 1. 待回复的权限/询问——不加锁,让回复立即送达
|
|
339
295
|
# (agent turn 持锁等待回复时,下一条消息作为回复立即 set_result,
|
|
340
296
|
# 不会因锁阻塞导致 300s 超时)
|
|
@@ -398,27 +354,16 @@ class ChannelRunner:
|
|
|
398
354
|
def _get_command_handler(self) -> Any:
|
|
399
355
|
"""按渠道类型返回对应的斜杠命令处理器
|
|
400
356
|
|
|
357
|
+
遍历 ChannelRegistry,匹配 adapter_class 后调用 command_handler_factory。
|
|
358
|
+
|
|
401
359
|
Returns:
|
|
402
360
|
BaseCommandHandler 实例或 None(未知渠道)
|
|
403
361
|
"""
|
|
404
|
-
from illusion.channels.
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
from illusion.channels.weixin.adapter import WeixinChannel
|
|
410
|
-
from illusion.channels.weixin.commands import WeixinCommandHandler
|
|
411
|
-
if isinstance(self.channel, WeixinChannel):
|
|
412
|
-
return WeixinCommandHandler(self.channel, self.session_store)
|
|
413
|
-
except ImportError:
|
|
414
|
-
pass # 微信模块不可用时跳过
|
|
415
|
-
try:
|
|
416
|
-
from illusion.channels.qq.adapter import QQChannel
|
|
417
|
-
from illusion.channels.qq.commands import QQCommandHandler
|
|
418
|
-
if isinstance(self.channel, QQChannel):
|
|
419
|
-
return QQCommandHandler(self.channel, self.session_store)
|
|
420
|
-
except ImportError:
|
|
421
|
-
pass # QQ 模块不可用时跳过
|
|
362
|
+
from illusion.channels.registry import ChannelRegistry
|
|
363
|
+
|
|
364
|
+
for desc in ChannelRegistry.all_descriptors():
|
|
365
|
+
if isinstance(self.channel, desc.adapter_class):
|
|
366
|
+
return desc.command_handler_factory(self.channel, self.session_store)
|
|
422
367
|
return None
|
|
423
368
|
|
|
424
369
|
async def _handle_stop(self, msg: "InboundMessage") -> None:
|
|
@@ -547,6 +492,14 @@ class ChannelRunner:
|
|
|
547
492
|
key = self.session_store.build_session_key(msg)
|
|
548
493
|
session = self.session_store.get_or_create(key, msg.user_id, msg.chat_type)
|
|
549
494
|
|
|
495
|
+
# 提前落盘会话索引(仅当文件尚不存在时):确保 session_id 落盘,
|
|
496
|
+
# 这样进程崩溃后下次启动 get_or_create 能命中该会话记录接续,
|
|
497
|
+
# 而非新建会话。注意:绝不覆盖已有 messages(否则会清空历史)。
|
|
498
|
+
try:
|
|
499
|
+
self.session_store.ensure_indexed(session)
|
|
500
|
+
except Exception as exc: # noqa: BLE001
|
|
501
|
+
logger.warning("会话索引提前落盘失败: %s", exc)
|
|
502
|
+
|
|
550
503
|
# 检测渠道是否支持消息编辑(仅飞书支持卡片 patch)
|
|
551
504
|
from illusion.channels.feishu.adapter import FeishuChannel
|
|
552
505
|
from illusion.channels.qq.adapter import QQChannel
|
|
@@ -600,18 +553,12 @@ class ChannelRunner:
|
|
|
600
553
|
await streaming_controller.start()
|
|
601
554
|
elif qq_c2c_streaming and qq_channel is not None:
|
|
602
555
|
# QQ C2C:用 stream_messages API 流式(首次有文本时才启动)
|
|
603
|
-
# 确保 token
|
|
604
|
-
|
|
605
|
-
from illusion.channels.qq.api import ensure_token
|
|
606
|
-
qq_channel._token = await ensure_token(
|
|
607
|
-
qq_channel._session,
|
|
608
|
-
qq_channel.config.app_id,
|
|
609
|
-
qq_channel.config.client_secret,
|
|
610
|
-
)
|
|
556
|
+
# 确保 token 已获取(通过 _get_token,重连后自动刷新)
|
|
557
|
+
token = await qq_channel._get_token()
|
|
611
558
|
from illusion.channels.qq.streaming import QQStreamingController
|
|
612
559
|
qq_streaming_controller = QQStreamingController(
|
|
613
560
|
session=qq_channel._session,
|
|
614
|
-
token=
|
|
561
|
+
token=token,
|
|
615
562
|
openid=msg.chat_id,
|
|
616
563
|
msg_id=msg.message_id,
|
|
617
564
|
)
|
|
@@ -889,10 +836,8 @@ def _create_session_store(
|
|
|
889
836
|
) -> Any:
|
|
890
837
|
"""根据渠道类型创建对应的 SessionStore
|
|
891
838
|
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
微信 → WeixinSessionStore
|
|
895
|
-
未知 → FeishuSessionStore(向后兼容)
|
|
839
|
+
遍历 ChannelRegistry,匹配 adapter_class 后调用 session_store_factory。
|
|
840
|
+
未知渠道回退到 FeishuSessionStore(向后兼容)。
|
|
896
841
|
|
|
897
842
|
Args:
|
|
898
843
|
channel: 渠道实例
|
|
@@ -902,30 +847,13 @@ def _create_session_store(
|
|
|
902
847
|
Returns:
|
|
903
848
|
对应渠道的 SessionStore 实例
|
|
904
849
|
"""
|
|
905
|
-
from illusion.channels.
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
)
|
|
912
|
-
try:
|
|
913
|
-
from illusion.channels.qq.adapter import QQChannel
|
|
914
|
-
if isinstance(channel, QQChannel):
|
|
915
|
-
from illusion.channels.qq.session_map import QQSessionStore
|
|
916
|
-
return QQSessionStore(
|
|
917
|
-
data_dir=data_dir,
|
|
918
|
-
group_sessions_per_user=group_sessions_per_user,
|
|
850
|
+
from illusion.channels.registry import ChannelRegistry
|
|
851
|
+
|
|
852
|
+
for desc in ChannelRegistry.all_descriptors():
|
|
853
|
+
if isinstance(channel, desc.adapter_class):
|
|
854
|
+
return desc.session_store_factory(
|
|
855
|
+
channel, data_dir, group_sessions_per_user
|
|
919
856
|
)
|
|
920
|
-
except ImportError:
|
|
921
|
-
pass
|
|
922
|
-
try:
|
|
923
|
-
from illusion.channels.weixin.adapter import WeixinChannel
|
|
924
|
-
if isinstance(channel, WeixinChannel):
|
|
925
|
-
from illusion.channels.weixin.session_map import WeixinSessionStore
|
|
926
|
-
return WeixinSessionStore(data_dir=data_dir)
|
|
927
|
-
except ImportError:
|
|
928
|
-
pass
|
|
929
857
|
# 未知渠道回退到飞书(向后兼容)
|
|
930
858
|
from illusion.channels.feishu.session_map import FeishuSessionStore
|
|
931
859
|
return FeishuSessionStore(
|
|
@@ -161,24 +161,34 @@ class ChannelsConfig(BaseModel):
|
|
|
161
161
|
def has_enabled_channels(self) -> bool:
|
|
162
162
|
"""是否有任何已启用的渠道
|
|
163
163
|
|
|
164
|
+
遍历 ChannelRegistry 检查每个渠道的 enabled 字段。
|
|
165
|
+
|
|
164
166
|
Returns:
|
|
165
167
|
bool: 任一渠道 enabled 为 True 时返回 True
|
|
166
168
|
"""
|
|
167
|
-
|
|
169
|
+
from illusion.channels.registry import ChannelRegistry
|
|
170
|
+
|
|
171
|
+
for desc in ChannelRegistry.all_descriptors():
|
|
172
|
+
channel_cfg = getattr(self, desc.config_attr, None)
|
|
173
|
+
if channel_cfg is not None and channel_cfg.enabled:
|
|
174
|
+
return True
|
|
175
|
+
return False
|
|
168
176
|
|
|
169
177
|
def enabled_channel_names(self) -> list[str]:
|
|
170
178
|
"""返回所有已启用渠道的名称列表
|
|
171
179
|
|
|
180
|
+
遍历 ChannelRegistry 收集已启用渠道名。
|
|
181
|
+
|
|
172
182
|
Returns:
|
|
173
183
|
list[str]: 已启用渠道名列表
|
|
174
184
|
"""
|
|
185
|
+
from illusion.channels.registry import ChannelRegistry
|
|
186
|
+
|
|
175
187
|
names: list[str] = []
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
if self.qq.enabled:
|
|
181
|
-
names.append("qq")
|
|
188
|
+
for desc in ChannelRegistry.all_descriptors():
|
|
189
|
+
channel_cfg = getattr(self, desc.config_attr, None)
|
|
190
|
+
if channel_cfg is not None and channel_cfg.enabled:
|
|
191
|
+
names.append(desc.name)
|
|
182
192
|
return names
|
|
183
193
|
|
|
184
194
|
|