From afd7c5fe85a0e6a80a536a4575a84bb4dd6d8179 Mon Sep 17 00:00:00 2001 From: yi <100551693+yi1108@users.noreply.github.com> Date: Wed, 13 May 2026 16:43:53 +0800 Subject: [PATCH] Update 2026-05-13 16:43:53 --- .gitignore | 41 +- README.md | 501 ++++-------------- README_en.md | 400 -------------- {nanobot => agent-core}/.dockerignore | 0 .../.github/workflows/ci.yml | 0 {nanobot => agent-core}/.gitignore | 0 {nanobot => agent-core}/COMMUNICATION.md | 0 {nanobot => agent-core}/CONTRIBUTING.md | 0 {nanobot => agent-core}/Dockerfile | 0 {nanobot => agent-core}/LICENSE | 0 {nanobot => agent-core}/README.md | 0 {nanobot => agent-core}/SECURITY.md | 0 {nanobot => agent-core}/bridge/package.json | 0 {nanobot => agent-core}/bridge/src/index.ts | 0 {nanobot => agent-core}/bridge/src/server.ts | 0 {nanobot => agent-core}/bridge/src/types.d.ts | 0 .../bridge/src/whatsapp.ts | 0 {nanobot => agent-core}/bridge/tsconfig.json | 0 {nanobot => agent-core}/case/code.gif | Bin {nanobot => agent-core}/case/memory.gif | Bin {nanobot => agent-core}/case/scedule.gif | Bin {nanobot => agent-core}/case/search.gif | Bin {nanobot => agent-core}/core_agent_lines.sh | 0 {nanobot => agent-core}/docker-compose.yml | 0 .../docs/CHANNEL_PLUGIN_GUIDE.md | 0 {nanobot => agent-core}/nanobot/__init__.py | 0 {nanobot => agent-core}/nanobot/__main__.py | 0 .../nanobot/agent/__init__.py | 0 .../nanobot/agent/context.py | 0 {nanobot => agent-core}/nanobot/agent/hook.py | 0 {nanobot => agent-core}/nanobot/agent/loop.py | 0 .../nanobot/agent/memory.py | 0 .../nanobot/agent/runner.py | 0 .../nanobot/agent/skills.py | 0 .../nanobot/agent/subagent.py | 0 .../nanobot/agent/tools/__init__.py | 0 .../nanobot/agent/tools/base.py | 0 .../nanobot/agent/tools/cron.py | 0 .../nanobot/agent/tools/filesystem.py | 0 .../nanobot/agent/tools/mcp.py | 0 .../nanobot/agent/tools/message.py | 0 .../nanobot/agent/tools/registry.py | 0 .../nanobot/agent/tools/shell.py | 0 .../nanobot/agent/tools/spawn.py | 0 .../nanobot/agent/tools/web.py | 0 .../nanobot/bus/__init__.py | 0 {nanobot => agent-core}/nanobot/bus/events.py | 0 {nanobot => agent-core}/nanobot/bus/queue.py | 0 .../nanobot/channels/__init__.py | 0 .../nanobot/channels/base.py | 0 .../nanobot/channels/dingtalk.py | 0 .../nanobot/channels/discord.py | 0 .../nanobot/channels/email.py | 0 .../nanobot/channels/feishu.py | 0 .../nanobot/channels/manager.py | 0 .../nanobot/channels/matrix.py | 0 .../nanobot/channels/mochat.py | 0 .../nanobot/channels/qq.py | 0 .../nanobot/channels/registry.py | 0 .../nanobot/channels/slack.py | 0 .../nanobot/channels/telegram.py | 0 .../nanobot/channels/wecom.py | 0 .../nanobot/channels/weixin.py | 0 .../nanobot/channels/whatsapp.py | 0 .../nanobot/cli/__init__.py | 0 .../nanobot/cli/commands.py | 0 {nanobot => agent-core}/nanobot/cli/models.py | 0 .../nanobot/cli/onboard.py | 0 {nanobot => agent-core}/nanobot/cli/stream.py | 0 .../nanobot/command/__init__.py | 0 .../nanobot/command/builtin.py | 0 .../nanobot/command/router.py | 0 .../nanobot/config/__init__.py | 0 .../nanobot/config/loader.py | 0 .../nanobot/config/paths.py | 0 .../nanobot/config/schema.py | 0 .../nanobot/cron/__init__.py | 0 .../nanobot/cron/service.py | 0 {nanobot => agent-core}/nanobot/cron/types.py | 0 .../nanobot/heartbeat/__init__.py | 0 .../nanobot/heartbeat/service.py | 0 .../nanobot/providers/__init__.py | 0 .../nanobot/providers/anthropic_provider.py | 0 .../providers/azure_openai_provider.py | 0 .../nanobot/providers/base.py | 0 .../providers/openai_codex_provider.py | 0 .../providers/openai_compat_provider.py | 0 .../nanobot/providers/registry.py | 0 .../nanobot/providers/transcription.py | 0 .../nanobot/security/__init__.py | 0 .../nanobot/security/network.py | 0 .../nanobot/session/__init__.py | 0 .../nanobot/session/manager.py | 0 .../nanobot/skills/README.md | 0 .../nanobot/skills/clawhub/SKILL.md | 0 .../nanobot/skills/cron/SKILL.md | 0 .../nanobot/skills/github/SKILL.md | 0 .../nanobot/skills/memory/SKILL.md | 0 .../nanobot/skills/skill-creator/SKILL.md | 0 .../skill-creator/scripts/init_skill.py | 0 .../skill-creator/scripts/package_skill.py | 0 .../skill-creator/scripts/quick_validate.py | 0 .../nanobot/skills/summarize/SKILL.md | 0 .../nanobot/skills/tmux/SKILL.md | 0 .../skills/tmux/scripts/find-sessions.sh | 0 .../skills/tmux/scripts/wait-for-text.sh | 0 .../nanobot/skills/weather/SKILL.md | 0 .../nanobot/templates/AGENTS.md | 0 .../nanobot/templates/HEARTBEAT.md | 0 .../nanobot/templates/SOUL.md | 0 .../nanobot/templates/TOOLS.md | 0 .../nanobot/templates/USER.md | 0 .../nanobot/templates}/__init__.py | 0 .../nanobot/templates/memory/MEMORY.md | 0 .../nanobot/templates/memory}/__init__.py | 0 .../nanobot/utils/__init__.py | 0 .../nanobot/utils/evaluator.py | 0 .../nanobot/utils/helpers.py | 0 {nanobot => agent-core}/nanobot_arch.png | Bin {nanobot => agent-core}/nanobot_logo.png | Bin {nanobot => agent-core}/pyproject.toml | 0 .../tests/agent/test_consolidate_offset.py | 0 .../tests/agent/test_context_prompt_cache.py | 0 .../tests/agent/test_evaluator.py | 0 .../agent/test_gemini_thought_signature.py | 0 .../tests/agent/test_heartbeat_service.py | 0 .../agent/test_loop_consolidation_tokens.py | 0 .../tests/agent/test_loop_cron_timezone.py | 0 .../tests/agent/test_loop_save_turn.py | 0 .../agent/test_memory_consolidation_types.py | 0 .../tests/agent/test_onboard_logic.py | 0 .../tests/agent/test_runner.py | 0 .../agent/test_session_manager_history.py | 0 .../tests/agent/test_skill_creator_scripts.py | 0 .../tests/agent/test_task_cancel.py | 0 .../tests/channels/test_base_channel.py | 0 .../test_channel_manager_delta_coalescing.py | 0 .../tests/channels/test_channel_plugins.py | 0 .../tests/channels/test_dingtalk_channel.py | 0 .../tests/channels/test_email_channel.py | 0 .../test_feishu_markdown_rendering.py | 0 .../channels/test_feishu_post_content.py | 0 .../tests/channels/test_feishu_reply.py | 0 .../tests/channels/test_feishu_streaming.py | 0 .../tests/channels/test_feishu_table_split.py | 0 .../test_feishu_tool_hint_code_block.py | 0 .../tests/channels/test_matrix_channel.py | 0 .../tests/channels/test_qq_channel.py | 0 .../tests/channels/test_slack_channel.py | 0 .../tests/channels/test_telegram_channel.py | 0 .../tests/channels/test_weixin_channel.py | 0 .../tests/channels/test_whatsapp_channel.py | 0 .../tests/cli/test_cli_input.py | 0 .../tests/cli/test_commands.py | 0 .../tests/cli/test_restart_command.py | 0 .../tests/config/test_config_migration.py | 0 .../tests/config/test_config_paths.py | 0 .../tests/cron/test_cron_service.py | 0 .../tests/cron/test_cron_tool_list.py | 0 .../providers/test_azure_openai_provider.py | 0 .../tests/providers/test_custom_provider.py | 0 .../tests/providers/test_litellm_kwargs.py | 0 .../tests/providers/test_mistral_provider.py | 0 .../tests/providers/test_provider_retry.py | 0 .../tests/providers/test_providers_init.py | 0 .../tests/security/test_security_network.py | 0 {nanobot => agent-core}/tests/test_docker.sh | 0 .../tests/tools/test_exec_security.py | 0 .../tests/tools/test_filesystem_tools.py | 0 .../tests/tools/test_mcp_tool.py | 0 .../tests/tools/test_message_tool.py | 0 .../tests/tools/test_message_tool_suppress.py | 0 .../tests/tools/test_tool_validation.py | 0 .../tests/tools/test_web_fetch_security.py | 0 .../tests/tools/test_web_search_tool.py | 0 {backend => dataclaw-api}/.gitignore | 0 dataclaw-api/Dockerfile | 55 ++ {backend => dataclaw-api}/README.md | 0 .../app/api => dataclaw-api/app}/__init__.py | 0 .../app/agent}/__init__.py | 0 {backend => dataclaw-api}/app/agent/chart.py | 2 +- {backend => dataclaw-api}/app/agent/nl2sql.py | 208 ++++++-- .../core => dataclaw-api/app/api}/__init__.py | 0 {backend => dataclaw-api}/app/api/a2a.py | 14 +- .../app/api/datasources.py | 0 .../app/api/embedding_models.py | 0 .../app/api/knowledge.py | 0 {backend => dataclaw-api}/app/api/llm.py | 0 {backend => dataclaw-api}/app/api/mcp.py | 0 {backend => dataclaw-api}/app/api/projects.py | 0 {backend => dataclaw-api}/app/api/semantic.py | 0 {backend => dataclaw-api}/app/api/skills.py | 0 .../app/api/subagents.py | 0 {backend => dataclaw-api}/app/api/upload.py | 0 {backend => dataclaw-api}/app/api/users.py | 0 .../app/api/web_search.py | 0 {backend => dataclaw-api}/app/cli.py | 2 +- .../app/connectors}/__init__.py | 0 .../app/connectors/clickhouse.py | 0 .../app/connectors/csv.py | 0 dataclaw-api/app/connectors/duckdb.py | 48 ++ .../app/connectors/factory.py | 19 +- .../app/connectors/parquet.py | 0 .../app/connectors/postgres.py | 0 {backend => dataclaw-api}/app/context.py | 0 .../app/core}/__init__.py | 0 .../app/core/artifacts.py | 0 .../app/core/data_root.py | 0 {backend => dataclaw-api}/app/core/email.py | 8 +- {backend => dataclaw-api}/app/core/files.py | 0 .../app/core/llm_provider.py | 26 + {backend => dataclaw-api}/app/core/nanobot.py | 9 +- .../core/patched_openai_compat_provider.py | 0 .../app/core/security.py | 0 .../app/core/session_alias_store.py | 0 {backend => dataclaw-api}/app/database.py | 0 {backend => dataclaw-api}/app/models/a2a.py | 0 .../app/models/datasource.py | 0 .../app/models/project.py | 0 .../app/models/subagent.py | 0 {backend => dataclaw-api}/app/models/user.py | 0 {backend => dataclaw-api}/app/schemas/a2a.py | 0 .../app/schemas/chart.py | 0 .../app/schemas/datasource.py | 0 .../app/schemas/embedding_model.py | 0 .../app/schemas/knowledge.py | 0 {backend => dataclaw-api}/app/schemas/mcp.py | 0 {backend => dataclaw-api}/app/schemas/mdl.py | 0 .../app/schemas/project.py | 0 .../app/schemas/subagent.py | 0 {backend => dataclaw-api}/app/schemas/user.py | 0 .../app/services/a2a_service.py | 0 .../app/services/embedding_model_store.py | 0 .../app/services/knowledge_base_store.py | 0 .../services/knowledge_global_config_store.py | 0 .../app/services/knowledge_index.py | 0 .../app/services/llm_cache.py | 0 {backend => dataclaw-api}/app/services/mdl.py | 0 .../app/services/openai_compat.py | 0 .../app/services/web_search_config_store.py | 0 .../frontend-design/LICENSE.txt | 0 .../skills_builtin/frontend-design/SKILL.md | 0 .../skills_builtin/knowledge-base/SKILL.md | 24 + .../skills_builtin/minimax-docx/.gitignore | 0 .../app/skills_builtin/minimax-docx/LICENSE | 0 .../app/skills_builtin/minimax-docx/SKILL.md | 0 .../assets/styles/academic_styles.xml | 0 .../assets/styles/corporate_styles.xml | 0 .../assets/styles/default_styles.xml | 0 .../assets/xsd/aesthetic-rules.xsd | 0 .../assets/xsd/business-rules.xsd | 0 .../minimax-docx/assets/xsd/common-types.xsd | 0 .../minimax-docx/assets/xsd/wml-subset.xsd | 0 .../minimax-docx/references/cjk_typography.md | 0 .../cjk_university_template_guide.md | 0 .../minimax-docx/references/comments_guide.md | 0 .../references/design_good_bad_examples.md | 0 .../references/design_principles.md | 0 .../references/openxml_element_order.md | 0 .../references/openxml_encyclopedia_part1.md | 0 .../references/openxml_encyclopedia_part2.md | 0 .../references/openxml_encyclopedia_part3.md | 0 .../references/openxml_namespaces.md | 0 .../minimax-docx/references/openxml_units.md | 0 .../references/scenario_a_create.md | 0 .../references/scenario_b_edit_content.md | 0 .../references/scenario_c_apply_template.md | 0 .../references/track_changes_guide.md | 0 .../references/troubleshooting.md | 0 .../references/typography_guide.md | 0 .../references/xsd_validation_guide.md | 0 .../minimax-docx/scripts/doc_to_docx.sh | 0 .../minimax-docx/scripts/docx_preview.sh | 0 .../MiniMaxAIDocx.Cli.csproj | 0 .../dotnet/MiniMaxAIDocx.Cli/Program.cs | 0 .../Commands/AnalyzeCommand.cs | 0 .../Commands/ApplyTemplateCommand.cs | 0 .../Commands/CreateCommand.cs | 0 .../Commands/DiffCommand.cs | 0 .../Commands/EditContentCommand.cs | 0 .../Commands/FixOrderCommand.cs | 0 .../Commands/MergeRunsCommand.cs | 0 .../Commands/ValidateCommand.cs | 0 .../MiniMaxAIDocx.Core.csproj | 0 .../OpenXml/CommentSynchronizer.cs | 0 .../OpenXml/ElementOrder.cs | 0 .../OpenXml/NamespaceConstants.cs | 0 .../MiniMaxAIDocx.Core/OpenXml/RunMerger.cs | 0 .../OpenXml/StyleAnalyzer.cs | 0 .../OpenXml/TrackChangesHelper.cs | 0 .../OpenXml/UnitConverter.cs | 0 .../Samples/AestheticRecipeSamples.cs | 0 .../Samples/AestheticRecipeSamples_Batch1.cs | 0 .../Samples/AestheticRecipeSamples_Batch2.cs | 0 .../Samples/AestheticRecipeSamples_Batch3.cs | 0 .../Samples/AestheticRecipeSamples_Batch4.cs | 0 .../Samples/CharacterFormattingSamples.cs | 0 .../Samples/DocumentCreationSamples.cs | 0 .../Samples/FieldAndTocSamples.cs | 0 .../Samples/FootnoteAndCommentSamples.cs | 0 .../Samples/HeaderFooterSamples.cs | 0 .../Samples/ImageSamples.cs | 0 .../Samples/ListAndNumberingSamples.cs | 0 .../Samples/ParagraphFormattingSamples.cs | 0 .../Samples/StyleSystemSamples.cs | 0 .../Samples/TableSamples.cs | 0 .../Samples/TrackChangesSamples.cs | 0 .../Typography/CjkHelper.cs | 0 .../Typography/FontDefaults.cs | 0 .../Typography/PageSizes.cs | 0 .../Validation/BusinessRuleValidator.cs | 0 .../Validation/GateCheckValidator.cs | 0 .../Validation/ValidationResult.cs | 0 .../Validation/XsdValidator.cs | 0 .../scripts/dotnet/MiniMaxAIDocx.slnx | 0 .../minimax-docx/scripts/env_check.sh | 0 .../minimax-docx/scripts/setup.ps1 | 0 .../minimax-docx/scripts/setup.sh | 0 .../app/skills_builtin/minimax-pdf/README.md | 0 .../app/skills_builtin/minimax-pdf/SKILL.md | 0 .../minimax-pdf/design/design.md | 0 .../minimax-pdf/scripts/cover.py | 0 .../minimax-pdf/scripts/fill_inspect.py | 0 .../minimax-pdf/scripts/fill_write.py | 0 .../minimax-pdf/scripts/make.sh | 0 .../minimax-pdf/scripts/merge.py | 0 .../minimax-pdf/scripts/palette.py | 0 .../minimax-pdf/scripts/reformat_parse.py | 0 .../minimax-pdf/scripts/render_body.py | 0 .../minimax-pdf/scripts/render_cover.js | 0 .../app/skills_builtin/minimax-xlsx/SKILL.md | 0 .../minimax-xlsx/references/create.md | 0 .../minimax-xlsx/references/edit.md | 0 .../minimax-xlsx/references/fix.md | 0 .../minimax-xlsx/references/format.md | 0 .../references/ooxml-cheatsheet.md | 0 .../minimax-xlsx/references/read-analyze.md | 0 .../minimax-xlsx/references/validate.md | 0 .../minimax-xlsx/scripts/formula_check.py | 0 .../scripts/libreoffice_recalc.py | 0 .../scripts/shared_strings_builder.py | 0 .../minimax-xlsx/scripts/style_audit.py | 0 .../minimax-xlsx/scripts/xlsx_add_column.py | 0 .../minimax-xlsx/scripts/xlsx_insert_row.py | 0 .../minimax-xlsx/scripts/xlsx_pack.py | 0 .../minimax-xlsx/scripts/xlsx_reader.py | 0 .../minimax-xlsx/scripts/xlsx_shift_rows.py | 0 .../minimax-xlsx/scripts/xlsx_unpack.py | 0 .../minimal_xlsx/[Content_Types].xml | 0 .../templates/minimal_xlsx/_rels/.rels | 0 .../minimal_xlsx/xl/_rels/workbook.xml.rels | 0 .../minimal_xlsx/xl/sharedStrings.xml | 0 .../templates/minimal_xlsx/xl/styles.xml | 0 .../templates/minimal_xlsx/xl/workbook.xml | 0 .../minimal_xlsx/xl/worksheets/sheet1.xml | 0 .../app/skills_builtin/nl2sql/SKILL.md | 0 .../skills_builtin/pptx-generator/SKILL.md | 0 .../references/design-system.md | 0 .../pptx-generator/references/editing.md | 0 .../pptx-generator/references/pitfalls.md | 0 .../pptx-generator/references/pptxgenjs.md | 0 .../pptx-generator/references/slide-types.md | 0 .../app/skills_builtin/visualization/SKILL.md | 0 .../app/tools/get_schema.py | 0 .../app/tools/knowledge_base.py | 0 {backend => dataclaw-api}/app/tools/nl2sql.py | 0 .../app/tools/subagent.py | 0 .../app/tools/visualization.py | 0 .../app/trace/__init__.py | 0 .../app/trace/attributes.py | 0 .../app/trace/service.py | 0 {backend => dataclaw-api}/hatch_build.py | 0 {backend => dataclaw-api}/main.py | 32 +- {backend => dataclaw-api}/pyproject.toml | 10 +- .../tests/test_a2a_backend.py | 0 .../tests/test_artifact_endpoints.py | 0 .../tests/test_artifacts.py | 0 .../tests/test_chat_project_id.py | 0 .../tests/test_data_root.py | 0 .../tests/test_dataclaw_cli.py | 0 .../tests/test_knowledge_base_backend.py | 0 .../tests/test_nanobot_project_resolution.py | 0 .../tests/test_nl2sql.py | 0 dataclaw-api/tests/test_nl2sql_optimized.py | 68 +++ .../test_patched_openai_compat_provider.py | 0 .../tests/test_subagent_detail_route.py | 0 .../test_subagent_tools_e2e_regression.py | 0 .../tests/test_trace_integration.py | 0 .../tests/test_webui_static_hosting.py | 0 {backend => dataclaw-api}/uv.lock | 74 ++- {frontend => dataclaw-ui}/.gitignore | 0 dataclaw-ui/Dockerfile | 16 + {frontend => dataclaw-ui}/README.md | 0 {frontend => dataclaw-ui}/components.json | 0 {frontend => dataclaw-ui}/eslint.config.js | 0 {frontend => dataclaw-ui}/index.html | 2 +- dataclaw-ui/nginx.conf | 51 ++ {frontend => dataclaw-ui}/package-lock.json | 0 {frontend => dataclaw-ui}/package.json | 0 {frontend => dataclaw-ui}/postcss.config.js | 0 {frontend => dataclaw-ui}/public/favicon.svg | 0 {frontend => dataclaw-ui}/public/icons.svg | 0 {frontend => dataclaw-ui}/src/App.css | 0 {frontend => dataclaw-ui}/src/App.tsx | 0 {frontend => dataclaw-ui}/src/api/a2a.ts | 0 .../src/api/subagents.ts | 0 {frontend => dataclaw-ui}/src/assets/hero.png | Bin .../src/assets/react.svg | 0 {frontend => dataclaw-ui}/src/assets/vite.svg | 0 .../src/components/ArtifactPanel.tsx | 0 .../src/components/ChatInterface.tsx | 37 +- .../src/components/DataSourceForm.tsx | 0 .../src/components/ErrorBoundary.tsx | 0 .../components/InlineVisualizationCard.tsx | 0 .../src/components/KnowledgeBaseForm.tsx | 0 .../src/components/ProjectSwitcher.tsx | 2 +- .../src/components/Sidebar.tsx | 29 +- .../src/components/SlashCommandMenu.tsx | 0 .../src/components/ThemeToggle.tsx | 0 .../src/components/VegaChart.tsx | 0 .../src/components/VisualizationPanel.tsx | 0 .../src/components/modeling/TableNode.tsx | 0 .../src/components/ui/button.tsx | 0 .../src/components/ui/card.tsx | 0 .../src/components/ui/command.tsx | 0 .../src/components/ui/dialog.tsx | 0 .../src/components/ui/dropdown-menu.tsx | 0 .../src/components/ui/input-group.tsx | 0 .../src/components/ui/input.tsx | 0 .../src/components/ui/label.tsx | 0 .../src/components/ui/popover.tsx | 0 .../src/components/ui/scroll-area.tsx | 0 .../src/components/ui/select.tsx | 0 .../src/components/ui/sheet.tsx | 0 .../src/components/ui/switch.tsx | 0 .../src/components/ui/table.tsx | 0 .../src/components/ui/textarea.tsx | 0 {frontend => dataclaw-ui}/src/i18n/config.ts | 0 .../src/i18n/locales/en.json | 4 +- .../src/i18n/locales/zh.json | 4 +- {frontend => dataclaw-ui}/src/index.css | 0 {frontend => dataclaw-ui}/src/lib/api.ts | 0 {frontend => dataclaw-ui}/src/lib/utils.ts | 0 {frontend => dataclaw-ui}/src/main.tsx | 0 .../src/pages/Dashboard.tsx | 0 .../src/pages/DataSources.tsx | 22 +- .../src/pages/EmbeddingModels.tsx | 0 .../src/pages/KnowledgeBases.tsx | 0 {frontend => dataclaw-ui}/src/pages/Login.tsx | 6 +- .../src/pages/ModelConfigs.tsx | 0 .../src/pages/Modeling.tsx | 0 .../src/pages/Projects.tsx | 0 .../src/pages/Settings.tsx | 0 .../src/pages/Skills.tsx | 0 .../src/pages/Subagents.tsx | 0 {frontend => dataclaw-ui}/src/pages/Users.tsx | 0 .../src/pages/VerifyEmail.tsx | 0 .../src/pages/WebSearchConfig.tsx | 0 .../src/store/authStore.ts | 0 .../src/store/dashboardStore.ts | 0 .../src/store/mcpHealthStore.ts | 0 .../src/store/projectStore.ts | 0 .../src/store/themeStore.ts | 0 .../src/store/visualizationStore.ts | 0 {frontend => dataclaw-ui}/tsconfig.app.json | 0 {frontend => dataclaw-ui}/tsconfig.json | 0 {frontend => dataclaw-ui}/tsconfig.node.json | 0 {frontend => dataclaw-ui}/vite.config.ts | 0 {whisper => dataclaw-voice}/.gitignore | 0 {whisper => dataclaw-voice}/README.md | 0 {whisper => dataclaw-voice}/main.py | 0 {whisper => dataclaw-voice}/requirements.txt | 0 docker-compose.yml | 58 ++ docs/artifact.png | Bin 1392949 -> 0 bytes docs/dashboard.png | Bin 407663 -> 0 bytes docs/index.png | Bin 321602 -> 0 bytes docs/kb.png | Bin 478043 -> 0 bytes images/image-20260513161419895.png | Bin 0 -> 168637 bytes images/image-20260513161428375.png | Bin 0 -> 167230 bytes images/image-20260513161445508.png | Bin 0 -> 83928 bytes images/image-20260513161532777.png | Bin 0 -> 79933 bytes images/image-20260513161554077.png | Bin 0 -> 277304 bytes images/image-20260513161558547.png | Bin 0 -> 204204 bytes images/image-20260513161604618.png | Bin 0 -> 83421 bytes images/image-20260513161610084.png | Bin 0 -> 77840 bytes images/image-20260513161616405.png | Bin 0 -> 76365 bytes images/image-20260513161621292.png | Bin 0 -> 81773 bytes images/image-20260513161626519.png | Bin 0 -> 99041 bytes images/image-20260513161644464.png | Bin 0 -> 178544 bytes images/image-20260513162417349.png | Bin 0 -> 103531 bytes 490 files changed, 850 insertions(+), 922 deletions(-) delete mode 100644 README_en.md rename {nanobot => agent-core}/.dockerignore (100%) rename {nanobot => agent-core}/.github/workflows/ci.yml (100%) rename {nanobot => agent-core}/.gitignore (100%) rename {nanobot => agent-core}/COMMUNICATION.md (100%) rename {nanobot => agent-core}/CONTRIBUTING.md (100%) rename {nanobot => agent-core}/Dockerfile (100%) rename {nanobot => agent-core}/LICENSE (100%) rename {nanobot => agent-core}/README.md (100%) rename {nanobot => agent-core}/SECURITY.md (100%) rename {nanobot => agent-core}/bridge/package.json (100%) rename {nanobot => agent-core}/bridge/src/index.ts (100%) rename {nanobot => agent-core}/bridge/src/server.ts (100%) rename {nanobot => agent-core}/bridge/src/types.d.ts (100%) rename {nanobot => agent-core}/bridge/src/whatsapp.ts (100%) rename {nanobot => agent-core}/bridge/tsconfig.json (100%) rename {nanobot => agent-core}/case/code.gif (100%) rename {nanobot => agent-core}/case/memory.gif (100%) rename {nanobot => agent-core}/case/scedule.gif (100%) rename {nanobot => agent-core}/case/search.gif (100%) rename {nanobot => agent-core}/core_agent_lines.sh (100%) mode change 100755 => 100644 rename {nanobot => agent-core}/docker-compose.yml (100%) rename {nanobot => agent-core}/docs/CHANNEL_PLUGIN_GUIDE.md (100%) rename {nanobot => agent-core}/nanobot/__init__.py (100%) rename {nanobot => agent-core}/nanobot/__main__.py (100%) rename {nanobot => agent-core}/nanobot/agent/__init__.py (100%) rename {nanobot => agent-core}/nanobot/agent/context.py (100%) rename {nanobot => agent-core}/nanobot/agent/hook.py (100%) rename {nanobot => agent-core}/nanobot/agent/loop.py (100%) rename {nanobot => agent-core}/nanobot/agent/memory.py (100%) rename {nanobot => agent-core}/nanobot/agent/runner.py (100%) rename {nanobot => agent-core}/nanobot/agent/skills.py (100%) rename {nanobot => agent-core}/nanobot/agent/subagent.py (100%) rename {nanobot => agent-core}/nanobot/agent/tools/__init__.py (100%) rename {nanobot => agent-core}/nanobot/agent/tools/base.py (100%) rename {nanobot => agent-core}/nanobot/agent/tools/cron.py (100%) rename {nanobot => agent-core}/nanobot/agent/tools/filesystem.py (100%) rename {nanobot => agent-core}/nanobot/agent/tools/mcp.py (100%) rename {nanobot => agent-core}/nanobot/agent/tools/message.py (100%) rename {nanobot => agent-core}/nanobot/agent/tools/registry.py (100%) rename {nanobot => agent-core}/nanobot/agent/tools/shell.py (100%) rename {nanobot => agent-core}/nanobot/agent/tools/spawn.py (100%) rename {nanobot => agent-core}/nanobot/agent/tools/web.py (100%) rename {nanobot => agent-core}/nanobot/bus/__init__.py (100%) rename {nanobot => agent-core}/nanobot/bus/events.py (100%) rename {nanobot => agent-core}/nanobot/bus/queue.py (100%) rename {nanobot => agent-core}/nanobot/channels/__init__.py (100%) rename {nanobot => agent-core}/nanobot/channels/base.py (100%) rename {nanobot => agent-core}/nanobot/channels/dingtalk.py (100%) rename {nanobot => agent-core}/nanobot/channels/discord.py (100%) rename {nanobot => agent-core}/nanobot/channels/email.py (100%) rename {nanobot => agent-core}/nanobot/channels/feishu.py (100%) rename {nanobot => agent-core}/nanobot/channels/manager.py (100%) rename {nanobot => agent-core}/nanobot/channels/matrix.py (100%) rename {nanobot => agent-core}/nanobot/channels/mochat.py (100%) rename {nanobot => agent-core}/nanobot/channels/qq.py (100%) rename {nanobot => agent-core}/nanobot/channels/registry.py (100%) rename {nanobot => agent-core}/nanobot/channels/slack.py (100%) rename {nanobot => agent-core}/nanobot/channels/telegram.py (100%) rename {nanobot => agent-core}/nanobot/channels/wecom.py (100%) rename {nanobot => agent-core}/nanobot/channels/weixin.py (100%) rename {nanobot => agent-core}/nanobot/channels/whatsapp.py (100%) rename {nanobot => agent-core}/nanobot/cli/__init__.py (100%) rename {nanobot => agent-core}/nanobot/cli/commands.py (100%) rename {nanobot => agent-core}/nanobot/cli/models.py (100%) rename {nanobot => agent-core}/nanobot/cli/onboard.py (100%) rename {nanobot => agent-core}/nanobot/cli/stream.py (100%) rename {nanobot => agent-core}/nanobot/command/__init__.py (100%) rename {nanobot => agent-core}/nanobot/command/builtin.py (100%) rename {nanobot => agent-core}/nanobot/command/router.py (100%) rename {nanobot => agent-core}/nanobot/config/__init__.py (100%) rename {nanobot => agent-core}/nanobot/config/loader.py (100%) rename {nanobot => agent-core}/nanobot/config/paths.py (100%) rename {nanobot => agent-core}/nanobot/config/schema.py (100%) rename {nanobot => agent-core}/nanobot/cron/__init__.py (100%) rename {nanobot => agent-core}/nanobot/cron/service.py (100%) rename {nanobot => agent-core}/nanobot/cron/types.py (100%) rename {nanobot => agent-core}/nanobot/heartbeat/__init__.py (100%) rename {nanobot => agent-core}/nanobot/heartbeat/service.py (100%) rename {nanobot => agent-core}/nanobot/providers/__init__.py (100%) rename {nanobot => agent-core}/nanobot/providers/anthropic_provider.py (100%) rename {nanobot => agent-core}/nanobot/providers/azure_openai_provider.py (100%) rename {nanobot => agent-core}/nanobot/providers/base.py (100%) rename {nanobot => agent-core}/nanobot/providers/openai_codex_provider.py (100%) rename {nanobot => agent-core}/nanobot/providers/openai_compat_provider.py (100%) rename {nanobot => agent-core}/nanobot/providers/registry.py (100%) rename {nanobot => agent-core}/nanobot/providers/transcription.py (100%) rename {nanobot => agent-core}/nanobot/security/__init__.py (100%) rename {nanobot => agent-core}/nanobot/security/network.py (100%) rename {nanobot => agent-core}/nanobot/session/__init__.py (100%) rename {nanobot => agent-core}/nanobot/session/manager.py (100%) rename {nanobot => agent-core}/nanobot/skills/README.md (100%) rename {nanobot => agent-core}/nanobot/skills/clawhub/SKILL.md (100%) rename {nanobot => agent-core}/nanobot/skills/cron/SKILL.md (100%) rename {nanobot => agent-core}/nanobot/skills/github/SKILL.md (100%) rename {nanobot => agent-core}/nanobot/skills/memory/SKILL.md (100%) rename {nanobot => agent-core}/nanobot/skills/skill-creator/SKILL.md (100%) rename {nanobot => agent-core}/nanobot/skills/skill-creator/scripts/init_skill.py (100%) mode change 100755 => 100644 rename {nanobot => agent-core}/nanobot/skills/skill-creator/scripts/package_skill.py (100%) mode change 100755 => 100644 rename {nanobot => agent-core}/nanobot/skills/skill-creator/scripts/quick_validate.py (100%) rename {nanobot => agent-core}/nanobot/skills/summarize/SKILL.md (100%) rename {nanobot => agent-core}/nanobot/skills/tmux/SKILL.md (100%) rename {nanobot => agent-core}/nanobot/skills/tmux/scripts/find-sessions.sh (100%) mode change 100755 => 100644 rename {nanobot => agent-core}/nanobot/skills/tmux/scripts/wait-for-text.sh (100%) mode change 100755 => 100644 rename {nanobot => agent-core}/nanobot/skills/weather/SKILL.md (100%) rename {nanobot => agent-core}/nanobot/templates/AGENTS.md (100%) rename {nanobot => agent-core}/nanobot/templates/HEARTBEAT.md (100%) rename {nanobot => agent-core}/nanobot/templates/SOUL.md (100%) rename {nanobot => agent-core}/nanobot/templates/TOOLS.md (100%) rename {nanobot => agent-core}/nanobot/templates/USER.md (100%) rename {backend/app => agent-core/nanobot/templates}/__init__.py (100%) rename {nanobot => agent-core}/nanobot/templates/memory/MEMORY.md (100%) rename {backend/app/agent => agent-core/nanobot/templates/memory}/__init__.py (100%) rename {nanobot => agent-core}/nanobot/utils/__init__.py (100%) rename {nanobot => agent-core}/nanobot/utils/evaluator.py (100%) rename {nanobot => agent-core}/nanobot/utils/helpers.py (100%) rename {nanobot => agent-core}/nanobot_arch.png (100%) rename {nanobot => agent-core}/nanobot_logo.png (100%) rename {nanobot => agent-core}/pyproject.toml (100%) rename {nanobot => agent-core}/tests/agent/test_consolidate_offset.py (100%) rename {nanobot => agent-core}/tests/agent/test_context_prompt_cache.py (100%) rename {nanobot => agent-core}/tests/agent/test_evaluator.py (100%) rename {nanobot => agent-core}/tests/agent/test_gemini_thought_signature.py (100%) rename {nanobot => agent-core}/tests/agent/test_heartbeat_service.py (100%) rename {nanobot => agent-core}/tests/agent/test_loop_consolidation_tokens.py (100%) rename {nanobot => agent-core}/tests/agent/test_loop_cron_timezone.py (100%) rename {nanobot => agent-core}/tests/agent/test_loop_save_turn.py (100%) rename {nanobot => agent-core}/tests/agent/test_memory_consolidation_types.py (100%) rename {nanobot => agent-core}/tests/agent/test_onboard_logic.py (100%) rename {nanobot => agent-core}/tests/agent/test_runner.py (100%) rename {nanobot => agent-core}/tests/agent/test_session_manager_history.py (100%) rename {nanobot => agent-core}/tests/agent/test_skill_creator_scripts.py (100%) rename {nanobot => agent-core}/tests/agent/test_task_cancel.py (100%) rename {nanobot => agent-core}/tests/channels/test_base_channel.py (100%) rename {nanobot => agent-core}/tests/channels/test_channel_manager_delta_coalescing.py (100%) rename {nanobot => agent-core}/tests/channels/test_channel_plugins.py (100%) rename {nanobot => agent-core}/tests/channels/test_dingtalk_channel.py (100%) rename {nanobot => agent-core}/tests/channels/test_email_channel.py (100%) rename {nanobot => agent-core}/tests/channels/test_feishu_markdown_rendering.py (100%) rename {nanobot => agent-core}/tests/channels/test_feishu_post_content.py (100%) rename {nanobot => agent-core}/tests/channels/test_feishu_reply.py (100%) rename {nanobot => agent-core}/tests/channels/test_feishu_streaming.py (100%) rename {nanobot => agent-core}/tests/channels/test_feishu_table_split.py (100%) rename {nanobot => agent-core}/tests/channels/test_feishu_tool_hint_code_block.py (100%) rename {nanobot => agent-core}/tests/channels/test_matrix_channel.py (100%) rename {nanobot => agent-core}/tests/channels/test_qq_channel.py (100%) rename {nanobot => agent-core}/tests/channels/test_slack_channel.py (100%) rename {nanobot => agent-core}/tests/channels/test_telegram_channel.py (100%) rename {nanobot => agent-core}/tests/channels/test_weixin_channel.py (100%) rename {nanobot => agent-core}/tests/channels/test_whatsapp_channel.py (100%) rename {nanobot => agent-core}/tests/cli/test_cli_input.py (100%) rename {nanobot => agent-core}/tests/cli/test_commands.py (100%) rename {nanobot => agent-core}/tests/cli/test_restart_command.py (100%) rename {nanobot => agent-core}/tests/config/test_config_migration.py (100%) rename {nanobot => agent-core}/tests/config/test_config_paths.py (100%) rename {nanobot => agent-core}/tests/cron/test_cron_service.py (100%) rename {nanobot => agent-core}/tests/cron/test_cron_tool_list.py (100%) rename {nanobot => agent-core}/tests/providers/test_azure_openai_provider.py (100%) rename {nanobot => agent-core}/tests/providers/test_custom_provider.py (100%) rename {nanobot => agent-core}/tests/providers/test_litellm_kwargs.py (100%) rename {nanobot => agent-core}/tests/providers/test_mistral_provider.py (100%) rename {nanobot => agent-core}/tests/providers/test_provider_retry.py (100%) rename {nanobot => agent-core}/tests/providers/test_providers_init.py (100%) rename {nanobot => agent-core}/tests/security/test_security_network.py (100%) rename {nanobot => agent-core}/tests/test_docker.sh (100%) rename {nanobot => agent-core}/tests/tools/test_exec_security.py (100%) rename {nanobot => agent-core}/tests/tools/test_filesystem_tools.py (100%) rename {nanobot => agent-core}/tests/tools/test_mcp_tool.py (100%) rename {nanobot => agent-core}/tests/tools/test_message_tool.py (100%) rename {nanobot => agent-core}/tests/tools/test_message_tool_suppress.py (100%) rename {nanobot => agent-core}/tests/tools/test_tool_validation.py (100%) rename {nanobot => agent-core}/tests/tools/test_web_fetch_security.py (100%) rename {nanobot => agent-core}/tests/tools/test_web_search_tool.py (100%) rename {backend => dataclaw-api}/.gitignore (100%) create mode 100644 dataclaw-api/Dockerfile rename {backend => dataclaw-api}/README.md (100%) rename {backend/app/api => dataclaw-api/app}/__init__.py (100%) rename {backend/app/connectors => dataclaw-api/app/agent}/__init__.py (100%) rename {backend => dataclaw-api}/app/agent/chart.py (99%) rename {backend => dataclaw-api}/app/agent/nl2sql.py (81%) rename {backend/app/core => dataclaw-api/app/api}/__init__.py (100%) rename {backend => dataclaw-api}/app/api/a2a.py (99%) rename {backend => dataclaw-api}/app/api/datasources.py (100%) rename {backend => dataclaw-api}/app/api/embedding_models.py (100%) rename {backend => dataclaw-api}/app/api/knowledge.py (100%) rename {backend => dataclaw-api}/app/api/llm.py (100%) rename {backend => dataclaw-api}/app/api/mcp.py (100%) rename {backend => dataclaw-api}/app/api/projects.py (100%) rename {backend => dataclaw-api}/app/api/semantic.py (100%) rename {backend => dataclaw-api}/app/api/skills.py (100%) rename {backend => dataclaw-api}/app/api/subagents.py (100%) rename {backend => dataclaw-api}/app/api/upload.py (100%) rename {backend => dataclaw-api}/app/api/users.py (100%) rename {backend => dataclaw-api}/app/api/web_search.py (100%) rename {backend => dataclaw-api}/app/cli.py (99%) rename {nanobot/nanobot/templates => dataclaw-api/app/connectors}/__init__.py (100%) rename {backend => dataclaw-api}/app/connectors/clickhouse.py (100%) rename {backend => dataclaw-api}/app/connectors/csv.py (100%) create mode 100644 dataclaw-api/app/connectors/duckdb.py rename {backend => dataclaw-api}/app/connectors/factory.py (78%) rename {backend => dataclaw-api}/app/connectors/parquet.py (100%) rename {backend => dataclaw-api}/app/connectors/postgres.py (100%) rename {backend => dataclaw-api}/app/context.py (100%) rename {nanobot/nanobot/templates/memory => dataclaw-api/app/core}/__init__.py (100%) rename {backend => dataclaw-api}/app/core/artifacts.py (100%) rename {backend => dataclaw-api}/app/core/data_root.py (100%) rename {backend => dataclaw-api}/app/core/email.py (81%) rename {backend => dataclaw-api}/app/core/files.py (100%) rename {backend => dataclaw-api}/app/core/llm_provider.py (63%) rename {backend => dataclaw-api}/app/core/nanobot.py (98%) rename {backend => dataclaw-api}/app/core/patched_openai_compat_provider.py (100%) rename {backend => dataclaw-api}/app/core/security.py (100%) rename {backend => dataclaw-api}/app/core/session_alias_store.py (100%) rename {backend => dataclaw-api}/app/database.py (100%) rename {backend => dataclaw-api}/app/models/a2a.py (100%) rename {backend => dataclaw-api}/app/models/datasource.py (100%) rename {backend => dataclaw-api}/app/models/project.py (100%) rename {backend => dataclaw-api}/app/models/subagent.py (100%) rename {backend => dataclaw-api}/app/models/user.py (100%) rename {backend => dataclaw-api}/app/schemas/a2a.py (100%) rename {backend => dataclaw-api}/app/schemas/chart.py (100%) rename {backend => dataclaw-api}/app/schemas/datasource.py (100%) rename {backend => dataclaw-api}/app/schemas/embedding_model.py (100%) rename {backend => dataclaw-api}/app/schemas/knowledge.py (100%) rename {backend => dataclaw-api}/app/schemas/mcp.py (100%) rename {backend => dataclaw-api}/app/schemas/mdl.py (100%) rename {backend => dataclaw-api}/app/schemas/project.py (100%) rename {backend => dataclaw-api}/app/schemas/subagent.py (100%) rename {backend => dataclaw-api}/app/schemas/user.py (100%) rename {backend => dataclaw-api}/app/services/a2a_service.py (100%) rename {backend => dataclaw-api}/app/services/embedding_model_store.py (100%) rename {backend => dataclaw-api}/app/services/knowledge_base_store.py (100%) rename {backend => dataclaw-api}/app/services/knowledge_global_config_store.py (100%) rename {backend => dataclaw-api}/app/services/knowledge_index.py (100%) rename {backend => dataclaw-api}/app/services/llm_cache.py (100%) rename {backend => dataclaw-api}/app/services/mdl.py (100%) rename {backend => dataclaw-api}/app/services/openai_compat.py (100%) rename {backend => dataclaw-api}/app/services/web_search_config_store.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/frontend-design/LICENSE.txt (100%) rename {backend => dataclaw-api}/app/skills_builtin/frontend-design/SKILL.md (100%) create mode 100644 dataclaw-api/app/skills_builtin/knowledge-base/SKILL.md rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/.gitignore (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/LICENSE (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/SKILL.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/assets/styles/academic_styles.xml (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/assets/styles/corporate_styles.xml (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/assets/styles/default_styles.xml (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/assets/xsd/aesthetic-rules.xsd (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/assets/xsd/business-rules.xsd (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/assets/xsd/common-types.xsd (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/assets/xsd/wml-subset.xsd (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/cjk_typography.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/cjk_university_template_guide.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/comments_guide.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/design_good_bad_examples.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/design_principles.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/openxml_element_order.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/openxml_encyclopedia_part1.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/openxml_encyclopedia_part2.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/openxml_encyclopedia_part3.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/openxml_namespaces.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/openxml_units.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/scenario_a_create.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/scenario_b_edit_content.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/scenario_c_apply_template.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/track_changes_guide.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/troubleshooting.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/typography_guide.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/references/xsd_validation_guide.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/doc_to_docx.sh (100%) mode change 100755 => 100644 rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/docx_preview.sh (100%) mode change 100755 => 100644 rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/env_check.sh (100%) mode change 100755 => 100644 rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/setup.ps1 (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-docx/scripts/setup.sh (100%) mode change 100755 => 100644 rename {backend => dataclaw-api}/app/skills_builtin/minimax-pdf/README.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-pdf/SKILL.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-pdf/design/design.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-pdf/scripts/cover.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-pdf/scripts/fill_inspect.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-pdf/scripts/fill_write.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-pdf/scripts/make.sh (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-pdf/scripts/merge.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-pdf/scripts/palette.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-pdf/scripts/reformat_parse.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-pdf/scripts/render_body.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-pdf/scripts/render_cover.js (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/SKILL.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/references/create.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/references/edit.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/references/fix.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/references/format.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/references/ooxml-cheatsheet.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/references/read-analyze.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/references/validate.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/scripts/formula_check.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/scripts/libreoffice_recalc.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/scripts/shared_strings_builder.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/scripts/style_audit.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/scripts/xlsx_add_column.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/scripts/xlsx_insert_row.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/scripts/xlsx_pack.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/scripts/xlsx_reader.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/scripts/xlsx_shift_rows.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/scripts/xlsx_unpack.py (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/_rels/.rels (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml (100%) rename {backend => dataclaw-api}/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml (100%) rename {backend => dataclaw-api}/app/skills_builtin/nl2sql/SKILL.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/pptx-generator/SKILL.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/pptx-generator/references/design-system.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/pptx-generator/references/editing.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/pptx-generator/references/pitfalls.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/pptx-generator/references/pptxgenjs.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/pptx-generator/references/slide-types.md (100%) rename {backend => dataclaw-api}/app/skills_builtin/visualization/SKILL.md (100%) rename {backend => dataclaw-api}/app/tools/get_schema.py (100%) rename {backend => dataclaw-api}/app/tools/knowledge_base.py (100%) rename {backend => dataclaw-api}/app/tools/nl2sql.py (100%) rename {backend => dataclaw-api}/app/tools/subagent.py (100%) rename {backend => dataclaw-api}/app/tools/visualization.py (100%) rename {backend => dataclaw-api}/app/trace/__init__.py (100%) rename {backend => dataclaw-api}/app/trace/attributes.py (100%) rename {backend => dataclaw-api}/app/trace/service.py (100%) rename {backend => dataclaw-api}/hatch_build.py (100%) rename {backend => dataclaw-api}/main.py (97%) rename {backend => dataclaw-api}/pyproject.toml (92%) rename {backend => dataclaw-api}/tests/test_a2a_backend.py (100%) rename {backend => dataclaw-api}/tests/test_artifact_endpoints.py (100%) rename {backend => dataclaw-api}/tests/test_artifacts.py (100%) rename {backend => dataclaw-api}/tests/test_chat_project_id.py (100%) rename {backend => dataclaw-api}/tests/test_data_root.py (100%) rename {backend => dataclaw-api}/tests/test_dataclaw_cli.py (100%) rename {backend => dataclaw-api}/tests/test_knowledge_base_backend.py (100%) rename {backend => dataclaw-api}/tests/test_nanobot_project_resolution.py (100%) rename {backend => dataclaw-api}/tests/test_nl2sql.py (100%) create mode 100644 dataclaw-api/tests/test_nl2sql_optimized.py rename {backend => dataclaw-api}/tests/test_patched_openai_compat_provider.py (100%) rename {backend => dataclaw-api}/tests/test_subagent_detail_route.py (100%) rename {backend => dataclaw-api}/tests/test_subagent_tools_e2e_regression.py (100%) rename {backend => dataclaw-api}/tests/test_trace_integration.py (100%) rename {backend => dataclaw-api}/tests/test_webui_static_hosting.py (100%) rename {backend => dataclaw-api}/uv.lock (99%) rename {frontend => dataclaw-ui}/.gitignore (100%) create mode 100644 dataclaw-ui/Dockerfile rename {frontend => dataclaw-ui}/README.md (100%) rename {frontend => dataclaw-ui}/components.json (100%) rename {frontend => dataclaw-ui}/eslint.config.js (100%) rename {frontend => dataclaw-ui}/index.html (96%) create mode 100644 dataclaw-ui/nginx.conf rename {frontend => dataclaw-ui}/package-lock.json (100%) rename {frontend => dataclaw-ui}/package.json (100%) rename {frontend => dataclaw-ui}/postcss.config.js (100%) rename {frontend => dataclaw-ui}/public/favicon.svg (100%) rename {frontend => dataclaw-ui}/public/icons.svg (100%) rename {frontend => dataclaw-ui}/src/App.css (100%) rename {frontend => dataclaw-ui}/src/App.tsx (100%) rename {frontend => dataclaw-ui}/src/api/a2a.ts (100%) rename {frontend => dataclaw-ui}/src/api/subagents.ts (100%) rename {frontend => dataclaw-ui}/src/assets/hero.png (100%) rename {frontend => dataclaw-ui}/src/assets/react.svg (100%) rename {frontend => dataclaw-ui}/src/assets/vite.svg (100%) rename {frontend => dataclaw-ui}/src/components/ArtifactPanel.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ChatInterface.tsx (98%) rename {frontend => dataclaw-ui}/src/components/DataSourceForm.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ErrorBoundary.tsx (100%) rename {frontend => dataclaw-ui}/src/components/InlineVisualizationCard.tsx (100%) rename {frontend => dataclaw-ui}/src/components/KnowledgeBaseForm.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ProjectSwitcher.tsx (99%) rename {frontend => dataclaw-ui}/src/components/Sidebar.tsx (97%) rename {frontend => dataclaw-ui}/src/components/SlashCommandMenu.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ThemeToggle.tsx (100%) rename {frontend => dataclaw-ui}/src/components/VegaChart.tsx (100%) rename {frontend => dataclaw-ui}/src/components/VisualizationPanel.tsx (100%) rename {frontend => dataclaw-ui}/src/components/modeling/TableNode.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ui/button.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ui/card.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ui/command.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ui/dialog.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ui/dropdown-menu.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ui/input-group.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ui/input.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ui/label.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ui/popover.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ui/scroll-area.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ui/select.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ui/sheet.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ui/switch.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ui/table.tsx (100%) rename {frontend => dataclaw-ui}/src/components/ui/textarea.tsx (100%) rename {frontend => dataclaw-ui}/src/i18n/config.ts (100%) rename {frontend => dataclaw-ui}/src/i18n/locales/en.json (99%) rename {frontend => dataclaw-ui}/src/i18n/locales/zh.json (99%) rename {frontend => dataclaw-ui}/src/index.css (100%) rename {frontend => dataclaw-ui}/src/lib/api.ts (100%) rename {frontend => dataclaw-ui}/src/lib/utils.ts (100%) rename {frontend => dataclaw-ui}/src/main.tsx (100%) rename {frontend => dataclaw-ui}/src/pages/Dashboard.tsx (100%) rename {frontend => dataclaw-ui}/src/pages/DataSources.tsx (100%) rename {frontend => dataclaw-ui}/src/pages/EmbeddingModels.tsx (100%) rename {frontend => dataclaw-ui}/src/pages/KnowledgeBases.tsx (100%) rename {frontend => dataclaw-ui}/src/pages/Login.tsx (98%) rename {frontend => dataclaw-ui}/src/pages/ModelConfigs.tsx (100%) rename {frontend => dataclaw-ui}/src/pages/Modeling.tsx (100%) rename {frontend => dataclaw-ui}/src/pages/Projects.tsx (100%) rename {frontend => dataclaw-ui}/src/pages/Settings.tsx (100%) rename {frontend => dataclaw-ui}/src/pages/Skills.tsx (100%) rename {frontend => dataclaw-ui}/src/pages/Subagents.tsx (100%) rename {frontend => dataclaw-ui}/src/pages/Users.tsx (100%) rename {frontend => dataclaw-ui}/src/pages/VerifyEmail.tsx (100%) rename {frontend => dataclaw-ui}/src/pages/WebSearchConfig.tsx (100%) rename {frontend => dataclaw-ui}/src/store/authStore.ts (100%) rename {frontend => dataclaw-ui}/src/store/dashboardStore.ts (100%) rename {frontend => dataclaw-ui}/src/store/mcpHealthStore.ts (100%) rename {frontend => dataclaw-ui}/src/store/projectStore.ts (100%) rename {frontend => dataclaw-ui}/src/store/themeStore.ts (100%) rename {frontend => dataclaw-ui}/src/store/visualizationStore.ts (100%) rename {frontend => dataclaw-ui}/tsconfig.app.json (100%) rename {frontend => dataclaw-ui}/tsconfig.json (100%) rename {frontend => dataclaw-ui}/tsconfig.node.json (100%) rename {frontend => dataclaw-ui}/vite.config.ts (100%) rename {whisper => dataclaw-voice}/.gitignore (100%) rename {whisper => dataclaw-voice}/README.md (100%) rename {whisper => dataclaw-voice}/main.py (100%) rename {whisper => dataclaw-voice}/requirements.txt (100%) create mode 100644 docker-compose.yml delete mode 100644 docs/artifact.png delete mode 100644 docs/dashboard.png delete mode 100644 docs/index.png delete mode 100644 docs/kb.png create mode 100644 images/image-20260513161419895.png create mode 100644 images/image-20260513161428375.png create mode 100644 images/image-20260513161445508.png create mode 100644 images/image-20260513161532777.png create mode 100644 images/image-20260513161554077.png create mode 100644 images/image-20260513161558547.png create mode 100644 images/image-20260513161604618.png create mode 100644 images/image-20260513161610084.png create mode 100644 images/image-20260513161616405.png create mode 100644 images/image-20260513161621292.png create mode 100644 images/image-20260513161626519.png create mode 100644 images/image-20260513161644464.png create mode 100644 images/image-20260513162417349.png diff --git a/.gitignore b/.gitignore index b944c4e..aa0810a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,38 @@ .env -.vscode -nanobot-0.1.4.post4 -data -_research -.trae +.env.* + +# OS / editor .DS_Store +Thumbs.db +.vscode/ +.idea/ + +# Python +__pycache__/ +*.py[cod] +.venv/ +venv/ + +# Node +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Build / artifacts +dist/ +build/ +*.log + +# Runtime data (mounted as DATA_ROOT in Docker) +data/ + +# Intermediate docs/state (do not commit) +.claude/ +.work/ + +# Local scratch +_research/ +.trae/ +nanobot-*/ \ No newline at end of file diff --git a/README.md b/README.md index acff494..104ad64 100644 --- a/README.md +++ b/README.md @@ -1,450 +1,149 @@ -[🇨🇳 简体中文](./README.md) | [🇬🇧 English](./README_en.md) +## 项目简介 -# 🦞 龙虾问数 (DataClaw) + -> **释放你的数据潜能,让分析像养龙虾一样简单爽快!** 🌊📊 -> 龙虾问数 (DataClaw) 是一个智能的、AI 驱动的数据分析平台。通过自然语言与你的数据对话,瞬间生成可视化图表,轻松搭建仪表盘——从此告别繁琐的 SQL 语句! +### 项目概述 -*** +**全源灵动**是一个面向数据分析与知识检索场景的 AI 平台:用自然语言问数、自动生成图表与报告,并管理分析产物,帮助团队更快得到可验证、可复用的结论。 -## ✨ 为什么选择龙虾问数? +### 项目起源 -受够了为了画个简单的柱状图而写半天复杂的 SQL 语句吗?龙虾问数就是你的私人数据科学家。借助强大的大语言模型 (LLM) 和智能 Agent 工作流,它能将你的自然语言提问精准转化为数据库查询,提取数据,并即时渲染出美观的可视化图表。 +数据分散在不同系统与文件中时,手写 SQL、手工出图、反复同步口径的成本高且难复用。全源灵动将“提问 → 查询 → 可视化 → 产出”串联为一条可复用的分析链路。 -无论你是要查询庞大的 Supabase/PostgreSQL 数据库,还是随手丢进一个 CSV 文件,龙虾问数都能轻松拿捏!🚀 +### 项目定位 -## 🌟 核心特性 +- 目标用户:业务/数据分析、运营、产品、研发等需要自助分析与报告产出的角色 +- 适用场景:NL2SQL 问数、知识库检索增强、自动图表与报告产出、任务委派与跟踪(A2A) -- **🗣️ 自然语言转 SQL**: 用大白话提问!它能理解你的数据表结构,生成准确的 SQL,甚至在报错时进行自我纠正 (Self-correction)。 -- **📚 智能知识库检索 (RAG)**: 支持上传 Word、PPT、PDF 等多种格式文档,通过向量检索增强回答,让你的私有文档“开口说话”。 -- **📈 即时数据可视化**: 拒绝枯燥的生肉表格,根据数据特征自动生成交互式图表。 -- **🗂️ 动态多数据源**: 无缝连接 PostgreSQL、Supabase,以及本地 CSV/Excel 文件上传解析。 -- **🧠 灵活的模型接入**: 原生集成 LiteLLM,支持随插随用 OpenAI、DeepSeek、智谱、通义千问 (DashScope)、火山引擎或任何兼容的 LLM 提供商。 -- **🛠️ 强大的 Agent 技能拓展**: 基于核心 `nanobot`框架(`OpenClaw`的精简版)构建。支持通过斜杠命令 (`/`) 快速调用自定义工具 (Skills),完美贴合特定业务逻辑。 -- **📊 可定制仪表盘 (Dashboard)**: 一键将对话中生成的图表固定到看板,拖拽布局,随时查看核心指标。 -- **📦 智能产物管理 (Artifact)**: 自动提取对话中生成的各种文件(网页报告、PDF、PPT、图片等),提供一键内嵌预览与下载功能,让成果触手可及。 +### 核心价值 -*** +- 更快:把“写 SQL / 查资料 / 出图”合并为一次对话驱动的分析流程 +- 更稳:对关键结果提供可回溯的查询与产物(Artifact) +- 更灵活:支持多数据源与可配置的模型接入 -## 📸 界面预览 +## 整体架构与技术栈 -
-
-
-
-
-
-
-
-Please click the link below to verify your email address and activate your account:
+请点击下方链接验证邮箱并激活账号:
-If you did not request this, please ignore this email.
+如果你没有发起该请求,请忽略此邮件。
""" diff --git a/backend/app/core/files.py b/dataclaw-api/app/core/files.py similarity index 100% rename from backend/app/core/files.py rename to dataclaw-api/app/core/files.py diff --git a/backend/app/core/llm_provider.py b/dataclaw-api/app/core/llm_provider.py similarity index 63% rename from backend/app/core/llm_provider.py rename to dataclaw-api/app/core/llm_provider.py index 9ab343c..96a21cc 100644 --- a/backend/app/core/llm_provider.py +++ b/dataclaw-api/app/core/llm_provider.py @@ -1,3 +1,4 @@ +import os from typing import Optional, Dict from nanobot.providers.azure_openai_provider import AzureOpenAIProvider @@ -18,6 +19,29 @@ def normalize_provider_name(provider: Optional[str]) -> Optional[str]: return alias_map.get(normalized, normalized) +def _running_in_docker() -> bool: + # Best-effort, cross-platform detection. + if os.environ.get("DATACLAW_RUNNING_IN_DOCKER", "").strip().lower() in ("1", "true", "yes", "y"): + return True + return os.path.exists("/.dockerenv") + + +def _rewrite_localhost_api_base(api_base: Optional[str]) -> Optional[str]: + """ + When running inside Docker, `localhost` points to the container itself. + For host-local LLMs (Ollama/vLLM), users often configure `http://localhost:...`, + which breaks in containers. We rewrite it to `host.docker.internal`. + """ + if not api_base: + return api_base + base = api_base.strip() + if base.startswith("http://localhost") or base.startswith("https://localhost"): + return base.replace("://localhost", "://host.docker.internal", 1) + if base.startswith("http://127.0.0.1") or base.startswith("https://127.0.0.1"): + return base.replace("://127.0.0.1", "://host.docker.internal", 1) + return api_base + + def build_llm_provider( *, model: str, @@ -29,6 +53,8 @@ def build_llm_provider( provider_name = normalize_provider_name(provider) spec = find_by_name(provider_name) if provider_name else None backend = spec.backend if spec else "openai_compat" + if _running_in_docker(): + api_base = _rewrite_localhost_api_base(api_base) if backend == "openai_codex" or model.startswith("openai-codex/"): return OpenAICodexProvider(default_model=model) diff --git a/backend/app/core/nanobot.py b/dataclaw-api/app/core/nanobot.py similarity index 98% rename from backend/app/core/nanobot.py rename to dataclaw-api/app/core/nanobot.py index 61599ce..01fd8d9 100644 --- a/backend/app/core/nanobot.py +++ b/dataclaw-api/app/core/nanobot.py @@ -11,8 +11,8 @@ from typing import List, Callable, Awaitable, Any, Dict # BUT nanobot package is in ../nanobot relative to backend/ # So we need to go up one more level to reach the parent of backend/ PROJECT_ROOT = Path(__file__).resolve().parents[3] -if str(PROJECT_ROOT / "nanobot") not in sys.path: - sys.path.append(str(PROJECT_ROOT / "nanobot")) +if str(PROJECT_ROOT / "agent-core") not in sys.path: + sys.path.append(str(PROJECT_ROOT / "agent-core")) from nanobot.agent.loop import AgentLoop from nanobot.bus.events import OutboundMessage @@ -32,6 +32,7 @@ from nanobot.config.schema import Config # Given the structure, importing here should be fine as long as skills.py doesn't import nanobot.py. from app.api.skills import load_skills from app.core.patched_openai_compat_provider import PatchedOpenAICompatProvider +from app.core.llm_provider import _rewrite_localhost_api_base, _running_in_docker from app.services.llm_cache import get_llm_configs, get_active_llm_config from app.services.web_search_config_store import get_web_search_config @@ -203,7 +204,7 @@ class NanobotIntegration: workspace_skills_root = workspace_path / "skills" workspace_skills_root.mkdir(parents=True, exist_ok=True) - for skill_name in ("nl2sql", "visualization"): + for skill_name in ("nl2sql", "visualization", "knowledge-base"): source_dir = builtin_root / skill_name source_skill_file = source_dir / "SKILL.md" if not source_skill_file.exists(): @@ -235,6 +236,8 @@ class NanobotIntegration: ): spec = find_by_name(provider_name) if provider_name else None backend = spec.backend if spec else "openai_compat" + if _running_in_docker(): + api_base = _rewrite_localhost_api_base(api_base) if backend == "openai_codex" or model.startswith("openai-codex/"): return OpenAICodexProvider(default_model=model) diff --git a/backend/app/core/patched_openai_compat_provider.py b/dataclaw-api/app/core/patched_openai_compat_provider.py similarity index 100% rename from backend/app/core/patched_openai_compat_provider.py rename to dataclaw-api/app/core/patched_openai_compat_provider.py diff --git a/backend/app/core/security.py b/dataclaw-api/app/core/security.py similarity index 100% rename from backend/app/core/security.py rename to dataclaw-api/app/core/security.py diff --git a/backend/app/core/session_alias_store.py b/dataclaw-api/app/core/session_alias_store.py similarity index 100% rename from backend/app/core/session_alias_store.py rename to dataclaw-api/app/core/session_alias_store.py diff --git a/backend/app/database.py b/dataclaw-api/app/database.py similarity index 100% rename from backend/app/database.py rename to dataclaw-api/app/database.py diff --git a/backend/app/models/a2a.py b/dataclaw-api/app/models/a2a.py similarity index 100% rename from backend/app/models/a2a.py rename to dataclaw-api/app/models/a2a.py diff --git a/backend/app/models/datasource.py b/dataclaw-api/app/models/datasource.py similarity index 100% rename from backend/app/models/datasource.py rename to dataclaw-api/app/models/datasource.py diff --git a/backend/app/models/project.py b/dataclaw-api/app/models/project.py similarity index 100% rename from backend/app/models/project.py rename to dataclaw-api/app/models/project.py diff --git a/backend/app/models/subagent.py b/dataclaw-api/app/models/subagent.py similarity index 100% rename from backend/app/models/subagent.py rename to dataclaw-api/app/models/subagent.py diff --git a/backend/app/models/user.py b/dataclaw-api/app/models/user.py similarity index 100% rename from backend/app/models/user.py rename to dataclaw-api/app/models/user.py diff --git a/backend/app/schemas/a2a.py b/dataclaw-api/app/schemas/a2a.py similarity index 100% rename from backend/app/schemas/a2a.py rename to dataclaw-api/app/schemas/a2a.py diff --git a/backend/app/schemas/chart.py b/dataclaw-api/app/schemas/chart.py similarity index 100% rename from backend/app/schemas/chart.py rename to dataclaw-api/app/schemas/chart.py diff --git a/backend/app/schemas/datasource.py b/dataclaw-api/app/schemas/datasource.py similarity index 100% rename from backend/app/schemas/datasource.py rename to dataclaw-api/app/schemas/datasource.py diff --git a/backend/app/schemas/embedding_model.py b/dataclaw-api/app/schemas/embedding_model.py similarity index 100% rename from backend/app/schemas/embedding_model.py rename to dataclaw-api/app/schemas/embedding_model.py diff --git a/backend/app/schemas/knowledge.py b/dataclaw-api/app/schemas/knowledge.py similarity index 100% rename from backend/app/schemas/knowledge.py rename to dataclaw-api/app/schemas/knowledge.py diff --git a/backend/app/schemas/mcp.py b/dataclaw-api/app/schemas/mcp.py similarity index 100% rename from backend/app/schemas/mcp.py rename to dataclaw-api/app/schemas/mcp.py diff --git a/backend/app/schemas/mdl.py b/dataclaw-api/app/schemas/mdl.py similarity index 100% rename from backend/app/schemas/mdl.py rename to dataclaw-api/app/schemas/mdl.py diff --git a/backend/app/schemas/project.py b/dataclaw-api/app/schemas/project.py similarity index 100% rename from backend/app/schemas/project.py rename to dataclaw-api/app/schemas/project.py diff --git a/backend/app/schemas/subagent.py b/dataclaw-api/app/schemas/subagent.py similarity index 100% rename from backend/app/schemas/subagent.py rename to dataclaw-api/app/schemas/subagent.py diff --git a/backend/app/schemas/user.py b/dataclaw-api/app/schemas/user.py similarity index 100% rename from backend/app/schemas/user.py rename to dataclaw-api/app/schemas/user.py diff --git a/backend/app/services/a2a_service.py b/dataclaw-api/app/services/a2a_service.py similarity index 100% rename from backend/app/services/a2a_service.py rename to dataclaw-api/app/services/a2a_service.py diff --git a/backend/app/services/embedding_model_store.py b/dataclaw-api/app/services/embedding_model_store.py similarity index 100% rename from backend/app/services/embedding_model_store.py rename to dataclaw-api/app/services/embedding_model_store.py diff --git a/backend/app/services/knowledge_base_store.py b/dataclaw-api/app/services/knowledge_base_store.py similarity index 100% rename from backend/app/services/knowledge_base_store.py rename to dataclaw-api/app/services/knowledge_base_store.py diff --git a/backend/app/services/knowledge_global_config_store.py b/dataclaw-api/app/services/knowledge_global_config_store.py similarity index 100% rename from backend/app/services/knowledge_global_config_store.py rename to dataclaw-api/app/services/knowledge_global_config_store.py diff --git a/backend/app/services/knowledge_index.py b/dataclaw-api/app/services/knowledge_index.py similarity index 100% rename from backend/app/services/knowledge_index.py rename to dataclaw-api/app/services/knowledge_index.py diff --git a/backend/app/services/llm_cache.py b/dataclaw-api/app/services/llm_cache.py similarity index 100% rename from backend/app/services/llm_cache.py rename to dataclaw-api/app/services/llm_cache.py diff --git a/backend/app/services/mdl.py b/dataclaw-api/app/services/mdl.py similarity index 100% rename from backend/app/services/mdl.py rename to dataclaw-api/app/services/mdl.py diff --git a/backend/app/services/openai_compat.py b/dataclaw-api/app/services/openai_compat.py similarity index 100% rename from backend/app/services/openai_compat.py rename to dataclaw-api/app/services/openai_compat.py diff --git a/backend/app/services/web_search_config_store.py b/dataclaw-api/app/services/web_search_config_store.py similarity index 100% rename from backend/app/services/web_search_config_store.py rename to dataclaw-api/app/services/web_search_config_store.py diff --git a/backend/app/skills_builtin/frontend-design/LICENSE.txt b/dataclaw-api/app/skills_builtin/frontend-design/LICENSE.txt similarity index 100% rename from backend/app/skills_builtin/frontend-design/LICENSE.txt rename to dataclaw-api/app/skills_builtin/frontend-design/LICENSE.txt diff --git a/backend/app/skills_builtin/frontend-design/SKILL.md b/dataclaw-api/app/skills_builtin/frontend-design/SKILL.md similarity index 100% rename from backend/app/skills_builtin/frontend-design/SKILL.md rename to dataclaw-api/app/skills_builtin/frontend-design/SKILL.md diff --git a/dataclaw-api/app/skills_builtin/knowledge-base/SKILL.md b/dataclaw-api/app/skills_builtin/knowledge-base/SKILL.md new file mode 100644 index 0000000..ceadc64 --- /dev/null +++ b/dataclaw-api/app/skills_builtin/knowledge-base/SKILL.md @@ -0,0 +1,24 @@ +--- +description: Retrieve information from the knowledge base (RAG) +metadata: + nanobot: + always: true +--- + +# Knowledge Base Skill + +You are an expert assistant with access to a knowledge base. You can use the `knowledge_retrieve` tool to find relevant information from documents to answer user questions. + +## When to use this skill +- When the user asks questions about specific documents, company policies, technical manuals, or any uploaded knowledge. +- When the user's question seems to require domain-specific knowledge that is not in your general training data but likely in the knowledge base. + +## How to use this skill +- Call the `knowledge_retrieve` tool with the user's query. +- You can adjust `top_k` (default is 5, max 20) if you need more or less context. + +## After using the tool +- The tool will return a list of relevant "hits" (document chunks) and optionally an AI-generated answer based on those hits. +- Synthesize the information from the hits to provide a comprehensive and accurate answer. +- Always cite the sources if provided in the metadata of the hits. +- If no relevant information is found, inform the user clearly. diff --git a/backend/app/skills_builtin/minimax-docx/.gitignore b/dataclaw-api/app/skills_builtin/minimax-docx/.gitignore similarity index 100% rename from backend/app/skills_builtin/minimax-docx/.gitignore rename to dataclaw-api/app/skills_builtin/minimax-docx/.gitignore diff --git a/backend/app/skills_builtin/minimax-docx/LICENSE b/dataclaw-api/app/skills_builtin/minimax-docx/LICENSE similarity index 100% rename from backend/app/skills_builtin/minimax-docx/LICENSE rename to dataclaw-api/app/skills_builtin/minimax-docx/LICENSE diff --git a/backend/app/skills_builtin/minimax-docx/SKILL.md b/dataclaw-api/app/skills_builtin/minimax-docx/SKILL.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/SKILL.md rename to dataclaw-api/app/skills_builtin/minimax-docx/SKILL.md diff --git a/backend/app/skills_builtin/minimax-docx/assets/styles/academic_styles.xml b/dataclaw-api/app/skills_builtin/minimax-docx/assets/styles/academic_styles.xml similarity index 100% rename from backend/app/skills_builtin/minimax-docx/assets/styles/academic_styles.xml rename to dataclaw-api/app/skills_builtin/minimax-docx/assets/styles/academic_styles.xml diff --git a/backend/app/skills_builtin/minimax-docx/assets/styles/corporate_styles.xml b/dataclaw-api/app/skills_builtin/minimax-docx/assets/styles/corporate_styles.xml similarity index 100% rename from backend/app/skills_builtin/minimax-docx/assets/styles/corporate_styles.xml rename to dataclaw-api/app/skills_builtin/minimax-docx/assets/styles/corporate_styles.xml diff --git a/backend/app/skills_builtin/minimax-docx/assets/styles/default_styles.xml b/dataclaw-api/app/skills_builtin/minimax-docx/assets/styles/default_styles.xml similarity index 100% rename from backend/app/skills_builtin/minimax-docx/assets/styles/default_styles.xml rename to dataclaw-api/app/skills_builtin/minimax-docx/assets/styles/default_styles.xml diff --git a/backend/app/skills_builtin/minimax-docx/assets/xsd/aesthetic-rules.xsd b/dataclaw-api/app/skills_builtin/minimax-docx/assets/xsd/aesthetic-rules.xsd similarity index 100% rename from backend/app/skills_builtin/minimax-docx/assets/xsd/aesthetic-rules.xsd rename to dataclaw-api/app/skills_builtin/minimax-docx/assets/xsd/aesthetic-rules.xsd diff --git a/backend/app/skills_builtin/minimax-docx/assets/xsd/business-rules.xsd b/dataclaw-api/app/skills_builtin/minimax-docx/assets/xsd/business-rules.xsd similarity index 100% rename from backend/app/skills_builtin/minimax-docx/assets/xsd/business-rules.xsd rename to dataclaw-api/app/skills_builtin/minimax-docx/assets/xsd/business-rules.xsd diff --git a/backend/app/skills_builtin/minimax-docx/assets/xsd/common-types.xsd b/dataclaw-api/app/skills_builtin/minimax-docx/assets/xsd/common-types.xsd similarity index 100% rename from backend/app/skills_builtin/minimax-docx/assets/xsd/common-types.xsd rename to dataclaw-api/app/skills_builtin/minimax-docx/assets/xsd/common-types.xsd diff --git a/backend/app/skills_builtin/minimax-docx/assets/xsd/wml-subset.xsd b/dataclaw-api/app/skills_builtin/minimax-docx/assets/xsd/wml-subset.xsd similarity index 100% rename from backend/app/skills_builtin/minimax-docx/assets/xsd/wml-subset.xsd rename to dataclaw-api/app/skills_builtin/minimax-docx/assets/xsd/wml-subset.xsd diff --git a/backend/app/skills_builtin/minimax-docx/references/cjk_typography.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/cjk_typography.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/cjk_typography.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/cjk_typography.md diff --git a/backend/app/skills_builtin/minimax-docx/references/cjk_university_template_guide.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/cjk_university_template_guide.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/cjk_university_template_guide.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/cjk_university_template_guide.md diff --git a/backend/app/skills_builtin/minimax-docx/references/comments_guide.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/comments_guide.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/comments_guide.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/comments_guide.md diff --git a/backend/app/skills_builtin/minimax-docx/references/design_good_bad_examples.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/design_good_bad_examples.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/design_good_bad_examples.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/design_good_bad_examples.md diff --git a/backend/app/skills_builtin/minimax-docx/references/design_principles.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/design_principles.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/design_principles.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/design_principles.md diff --git a/backend/app/skills_builtin/minimax-docx/references/openxml_element_order.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/openxml_element_order.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/openxml_element_order.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/openxml_element_order.md diff --git a/backend/app/skills_builtin/minimax-docx/references/openxml_encyclopedia_part1.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/openxml_encyclopedia_part1.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/openxml_encyclopedia_part1.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/openxml_encyclopedia_part1.md diff --git a/backend/app/skills_builtin/minimax-docx/references/openxml_encyclopedia_part2.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/openxml_encyclopedia_part2.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/openxml_encyclopedia_part2.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/openxml_encyclopedia_part2.md diff --git a/backend/app/skills_builtin/minimax-docx/references/openxml_encyclopedia_part3.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/openxml_encyclopedia_part3.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/openxml_encyclopedia_part3.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/openxml_encyclopedia_part3.md diff --git a/backend/app/skills_builtin/minimax-docx/references/openxml_namespaces.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/openxml_namespaces.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/openxml_namespaces.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/openxml_namespaces.md diff --git a/backend/app/skills_builtin/minimax-docx/references/openxml_units.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/openxml_units.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/openxml_units.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/openxml_units.md diff --git a/backend/app/skills_builtin/minimax-docx/references/scenario_a_create.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/scenario_a_create.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/scenario_a_create.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/scenario_a_create.md diff --git a/backend/app/skills_builtin/minimax-docx/references/scenario_b_edit_content.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/scenario_b_edit_content.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/scenario_b_edit_content.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/scenario_b_edit_content.md diff --git a/backend/app/skills_builtin/minimax-docx/references/scenario_c_apply_template.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/scenario_c_apply_template.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/scenario_c_apply_template.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/scenario_c_apply_template.md diff --git a/backend/app/skills_builtin/minimax-docx/references/track_changes_guide.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/track_changes_guide.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/track_changes_guide.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/track_changes_guide.md diff --git a/backend/app/skills_builtin/minimax-docx/references/troubleshooting.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/troubleshooting.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/troubleshooting.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/troubleshooting.md diff --git a/backend/app/skills_builtin/minimax-docx/references/typography_guide.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/typography_guide.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/typography_guide.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/typography_guide.md diff --git a/backend/app/skills_builtin/minimax-docx/references/xsd_validation_guide.md b/dataclaw-api/app/skills_builtin/minimax-docx/references/xsd_validation_guide.md similarity index 100% rename from backend/app/skills_builtin/minimax-docx/references/xsd_validation_guide.md rename to dataclaw-api/app/skills_builtin/minimax-docx/references/xsd_validation_guide.md diff --git a/backend/app/skills_builtin/minimax-docx/scripts/doc_to_docx.sh b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/doc_to_docx.sh old mode 100755 new mode 100644 similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/doc_to_docx.sh rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/doc_to_docx.sh diff --git a/backend/app/skills_builtin/minimax-docx/scripts/docx_preview.sh b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/docx_preview.sh old mode 100755 new mode 100644 similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/docx_preview.sh rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/docx_preview.sh diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs diff --git a/backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx diff --git a/backend/app/skills_builtin/minimax-docx/scripts/env_check.sh b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/env_check.sh old mode 100755 new mode 100644 similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/env_check.sh rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/env_check.sh diff --git a/backend/app/skills_builtin/minimax-docx/scripts/setup.ps1 b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/setup.ps1 similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/setup.ps1 rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/setup.ps1 diff --git a/backend/app/skills_builtin/minimax-docx/scripts/setup.sh b/dataclaw-api/app/skills_builtin/minimax-docx/scripts/setup.sh old mode 100755 new mode 100644 similarity index 100% rename from backend/app/skills_builtin/minimax-docx/scripts/setup.sh rename to dataclaw-api/app/skills_builtin/minimax-docx/scripts/setup.sh diff --git a/backend/app/skills_builtin/minimax-pdf/README.md b/dataclaw-api/app/skills_builtin/minimax-pdf/README.md similarity index 100% rename from backend/app/skills_builtin/minimax-pdf/README.md rename to dataclaw-api/app/skills_builtin/minimax-pdf/README.md diff --git a/backend/app/skills_builtin/minimax-pdf/SKILL.md b/dataclaw-api/app/skills_builtin/minimax-pdf/SKILL.md similarity index 100% rename from backend/app/skills_builtin/minimax-pdf/SKILL.md rename to dataclaw-api/app/skills_builtin/minimax-pdf/SKILL.md diff --git a/backend/app/skills_builtin/minimax-pdf/design/design.md b/dataclaw-api/app/skills_builtin/minimax-pdf/design/design.md similarity index 100% rename from backend/app/skills_builtin/minimax-pdf/design/design.md rename to dataclaw-api/app/skills_builtin/minimax-pdf/design/design.md diff --git a/backend/app/skills_builtin/minimax-pdf/scripts/cover.py b/dataclaw-api/app/skills_builtin/minimax-pdf/scripts/cover.py similarity index 100% rename from backend/app/skills_builtin/minimax-pdf/scripts/cover.py rename to dataclaw-api/app/skills_builtin/minimax-pdf/scripts/cover.py diff --git a/backend/app/skills_builtin/minimax-pdf/scripts/fill_inspect.py b/dataclaw-api/app/skills_builtin/minimax-pdf/scripts/fill_inspect.py similarity index 100% rename from backend/app/skills_builtin/minimax-pdf/scripts/fill_inspect.py rename to dataclaw-api/app/skills_builtin/minimax-pdf/scripts/fill_inspect.py diff --git a/backend/app/skills_builtin/minimax-pdf/scripts/fill_write.py b/dataclaw-api/app/skills_builtin/minimax-pdf/scripts/fill_write.py similarity index 100% rename from backend/app/skills_builtin/minimax-pdf/scripts/fill_write.py rename to dataclaw-api/app/skills_builtin/minimax-pdf/scripts/fill_write.py diff --git a/backend/app/skills_builtin/minimax-pdf/scripts/make.sh b/dataclaw-api/app/skills_builtin/minimax-pdf/scripts/make.sh similarity index 100% rename from backend/app/skills_builtin/minimax-pdf/scripts/make.sh rename to dataclaw-api/app/skills_builtin/minimax-pdf/scripts/make.sh diff --git a/backend/app/skills_builtin/minimax-pdf/scripts/merge.py b/dataclaw-api/app/skills_builtin/minimax-pdf/scripts/merge.py similarity index 100% rename from backend/app/skills_builtin/minimax-pdf/scripts/merge.py rename to dataclaw-api/app/skills_builtin/minimax-pdf/scripts/merge.py diff --git a/backend/app/skills_builtin/minimax-pdf/scripts/palette.py b/dataclaw-api/app/skills_builtin/minimax-pdf/scripts/palette.py similarity index 100% rename from backend/app/skills_builtin/minimax-pdf/scripts/palette.py rename to dataclaw-api/app/skills_builtin/minimax-pdf/scripts/palette.py diff --git a/backend/app/skills_builtin/minimax-pdf/scripts/reformat_parse.py b/dataclaw-api/app/skills_builtin/minimax-pdf/scripts/reformat_parse.py similarity index 100% rename from backend/app/skills_builtin/minimax-pdf/scripts/reformat_parse.py rename to dataclaw-api/app/skills_builtin/minimax-pdf/scripts/reformat_parse.py diff --git a/backend/app/skills_builtin/minimax-pdf/scripts/render_body.py b/dataclaw-api/app/skills_builtin/minimax-pdf/scripts/render_body.py similarity index 100% rename from backend/app/skills_builtin/minimax-pdf/scripts/render_body.py rename to dataclaw-api/app/skills_builtin/minimax-pdf/scripts/render_body.py diff --git a/backend/app/skills_builtin/minimax-pdf/scripts/render_cover.js b/dataclaw-api/app/skills_builtin/minimax-pdf/scripts/render_cover.js similarity index 100% rename from backend/app/skills_builtin/minimax-pdf/scripts/render_cover.js rename to dataclaw-api/app/skills_builtin/minimax-pdf/scripts/render_cover.js diff --git a/backend/app/skills_builtin/minimax-xlsx/SKILL.md b/dataclaw-api/app/skills_builtin/minimax-xlsx/SKILL.md similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/SKILL.md rename to dataclaw-api/app/skills_builtin/minimax-xlsx/SKILL.md diff --git a/backend/app/skills_builtin/minimax-xlsx/references/create.md b/dataclaw-api/app/skills_builtin/minimax-xlsx/references/create.md similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/references/create.md rename to dataclaw-api/app/skills_builtin/minimax-xlsx/references/create.md diff --git a/backend/app/skills_builtin/minimax-xlsx/references/edit.md b/dataclaw-api/app/skills_builtin/minimax-xlsx/references/edit.md similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/references/edit.md rename to dataclaw-api/app/skills_builtin/minimax-xlsx/references/edit.md diff --git a/backend/app/skills_builtin/minimax-xlsx/references/fix.md b/dataclaw-api/app/skills_builtin/minimax-xlsx/references/fix.md similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/references/fix.md rename to dataclaw-api/app/skills_builtin/minimax-xlsx/references/fix.md diff --git a/backend/app/skills_builtin/minimax-xlsx/references/format.md b/dataclaw-api/app/skills_builtin/minimax-xlsx/references/format.md similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/references/format.md rename to dataclaw-api/app/skills_builtin/minimax-xlsx/references/format.md diff --git a/backend/app/skills_builtin/minimax-xlsx/references/ooxml-cheatsheet.md b/dataclaw-api/app/skills_builtin/minimax-xlsx/references/ooxml-cheatsheet.md similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/references/ooxml-cheatsheet.md rename to dataclaw-api/app/skills_builtin/minimax-xlsx/references/ooxml-cheatsheet.md diff --git a/backend/app/skills_builtin/minimax-xlsx/references/read-analyze.md b/dataclaw-api/app/skills_builtin/minimax-xlsx/references/read-analyze.md similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/references/read-analyze.md rename to dataclaw-api/app/skills_builtin/minimax-xlsx/references/read-analyze.md diff --git a/backend/app/skills_builtin/minimax-xlsx/references/validate.md b/dataclaw-api/app/skills_builtin/minimax-xlsx/references/validate.md similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/references/validate.md rename to dataclaw-api/app/skills_builtin/minimax-xlsx/references/validate.md diff --git a/backend/app/skills_builtin/minimax-xlsx/scripts/formula_check.py b/dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/formula_check.py similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/scripts/formula_check.py rename to dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/formula_check.py diff --git a/backend/app/skills_builtin/minimax-xlsx/scripts/libreoffice_recalc.py b/dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/libreoffice_recalc.py similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/scripts/libreoffice_recalc.py rename to dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/libreoffice_recalc.py diff --git a/backend/app/skills_builtin/minimax-xlsx/scripts/shared_strings_builder.py b/dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/shared_strings_builder.py similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/scripts/shared_strings_builder.py rename to dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/shared_strings_builder.py diff --git a/backend/app/skills_builtin/minimax-xlsx/scripts/style_audit.py b/dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/style_audit.py similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/scripts/style_audit.py rename to dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/style_audit.py diff --git a/backend/app/skills_builtin/minimax-xlsx/scripts/xlsx_add_column.py b/dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/xlsx_add_column.py similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/scripts/xlsx_add_column.py rename to dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/xlsx_add_column.py diff --git a/backend/app/skills_builtin/minimax-xlsx/scripts/xlsx_insert_row.py b/dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/xlsx_insert_row.py similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/scripts/xlsx_insert_row.py rename to dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/xlsx_insert_row.py diff --git a/backend/app/skills_builtin/minimax-xlsx/scripts/xlsx_pack.py b/dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/xlsx_pack.py similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/scripts/xlsx_pack.py rename to dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/xlsx_pack.py diff --git a/backend/app/skills_builtin/minimax-xlsx/scripts/xlsx_reader.py b/dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/xlsx_reader.py similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/scripts/xlsx_reader.py rename to dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/xlsx_reader.py diff --git a/backend/app/skills_builtin/minimax-xlsx/scripts/xlsx_shift_rows.py b/dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/xlsx_shift_rows.py similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/scripts/xlsx_shift_rows.py rename to dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/xlsx_shift_rows.py diff --git a/backend/app/skills_builtin/minimax-xlsx/scripts/xlsx_unpack.py b/dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/xlsx_unpack.py similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/scripts/xlsx_unpack.py rename to dataclaw-api/app/skills_builtin/minimax-xlsx/scripts/xlsx_unpack.py diff --git a/backend/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml b/dataclaw-api/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml rename to dataclaw-api/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml diff --git a/backend/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/_rels/.rels b/dataclaw-api/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/_rels/.rels similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/_rels/.rels rename to dataclaw-api/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/_rels/.rels diff --git a/backend/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels b/dataclaw-api/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels rename to dataclaw-api/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels diff --git a/backend/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml b/dataclaw-api/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml rename to dataclaw-api/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml diff --git a/backend/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml b/dataclaw-api/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml rename to dataclaw-api/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml diff --git a/backend/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml b/dataclaw-api/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml rename to dataclaw-api/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml diff --git a/backend/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml b/dataclaw-api/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml similarity index 100% rename from backend/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml rename to dataclaw-api/app/skills_builtin/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml diff --git a/backend/app/skills_builtin/nl2sql/SKILL.md b/dataclaw-api/app/skills_builtin/nl2sql/SKILL.md similarity index 100% rename from backend/app/skills_builtin/nl2sql/SKILL.md rename to dataclaw-api/app/skills_builtin/nl2sql/SKILL.md diff --git a/backend/app/skills_builtin/pptx-generator/SKILL.md b/dataclaw-api/app/skills_builtin/pptx-generator/SKILL.md similarity index 100% rename from backend/app/skills_builtin/pptx-generator/SKILL.md rename to dataclaw-api/app/skills_builtin/pptx-generator/SKILL.md diff --git a/backend/app/skills_builtin/pptx-generator/references/design-system.md b/dataclaw-api/app/skills_builtin/pptx-generator/references/design-system.md similarity index 100% rename from backend/app/skills_builtin/pptx-generator/references/design-system.md rename to dataclaw-api/app/skills_builtin/pptx-generator/references/design-system.md diff --git a/backend/app/skills_builtin/pptx-generator/references/editing.md b/dataclaw-api/app/skills_builtin/pptx-generator/references/editing.md similarity index 100% rename from backend/app/skills_builtin/pptx-generator/references/editing.md rename to dataclaw-api/app/skills_builtin/pptx-generator/references/editing.md diff --git a/backend/app/skills_builtin/pptx-generator/references/pitfalls.md b/dataclaw-api/app/skills_builtin/pptx-generator/references/pitfalls.md similarity index 100% rename from backend/app/skills_builtin/pptx-generator/references/pitfalls.md rename to dataclaw-api/app/skills_builtin/pptx-generator/references/pitfalls.md diff --git a/backend/app/skills_builtin/pptx-generator/references/pptxgenjs.md b/dataclaw-api/app/skills_builtin/pptx-generator/references/pptxgenjs.md similarity index 100% rename from backend/app/skills_builtin/pptx-generator/references/pptxgenjs.md rename to dataclaw-api/app/skills_builtin/pptx-generator/references/pptxgenjs.md diff --git a/backend/app/skills_builtin/pptx-generator/references/slide-types.md b/dataclaw-api/app/skills_builtin/pptx-generator/references/slide-types.md similarity index 100% rename from backend/app/skills_builtin/pptx-generator/references/slide-types.md rename to dataclaw-api/app/skills_builtin/pptx-generator/references/slide-types.md diff --git a/backend/app/skills_builtin/visualization/SKILL.md b/dataclaw-api/app/skills_builtin/visualization/SKILL.md similarity index 100% rename from backend/app/skills_builtin/visualization/SKILL.md rename to dataclaw-api/app/skills_builtin/visualization/SKILL.md diff --git a/backend/app/tools/get_schema.py b/dataclaw-api/app/tools/get_schema.py similarity index 100% rename from backend/app/tools/get_schema.py rename to dataclaw-api/app/tools/get_schema.py diff --git a/backend/app/tools/knowledge_base.py b/dataclaw-api/app/tools/knowledge_base.py similarity index 100% rename from backend/app/tools/knowledge_base.py rename to dataclaw-api/app/tools/knowledge_base.py diff --git a/backend/app/tools/nl2sql.py b/dataclaw-api/app/tools/nl2sql.py similarity index 100% rename from backend/app/tools/nl2sql.py rename to dataclaw-api/app/tools/nl2sql.py diff --git a/backend/app/tools/subagent.py b/dataclaw-api/app/tools/subagent.py similarity index 100% rename from backend/app/tools/subagent.py rename to dataclaw-api/app/tools/subagent.py diff --git a/backend/app/tools/visualization.py b/dataclaw-api/app/tools/visualization.py similarity index 100% rename from backend/app/tools/visualization.py rename to dataclaw-api/app/tools/visualization.py diff --git a/backend/app/trace/__init__.py b/dataclaw-api/app/trace/__init__.py similarity index 100% rename from backend/app/trace/__init__.py rename to dataclaw-api/app/trace/__init__.py diff --git a/backend/app/trace/attributes.py b/dataclaw-api/app/trace/attributes.py similarity index 100% rename from backend/app/trace/attributes.py rename to dataclaw-api/app/trace/attributes.py diff --git a/backend/app/trace/service.py b/dataclaw-api/app/trace/service.py similarity index 100% rename from backend/app/trace/service.py rename to dataclaw-api/app/trace/service.py diff --git a/backend/hatch_build.py b/dataclaw-api/hatch_build.py similarity index 100% rename from backend/hatch_build.py rename to dataclaw-api/hatch_build.py diff --git a/backend/main.py b/dataclaw-api/main.py similarity index 97% rename from backend/main.py rename to dataclaw-api/main.py index d2578d1..3f81dd9 100644 --- a/backend/main.py +++ b/dataclaw-api/main.py @@ -122,7 +122,7 @@ def _resolve_webui_directory() -> Optional[Path]: source_webui = Path(__file__).resolve().parent / "app" / "webui" if source_webui.is_dir(): return source_webui - source_dist = Path(__file__).resolve().parent.parent / "frontend" / "dist" + source_dist = Path(__file__).resolve().parent.parent / "dataclaw-ui" / "dist" if source_dist.is_dir(): return source_dist return None @@ -156,7 +156,7 @@ async def shutdown_event(): async def read_root(): if _WEBUI_INDEX and _WEBUI_INDEX.is_file(): return FileResponse(path=str(_WEBUI_INDEX), media_type="text/html") - return {"Hello": "DataClaw Backend"} + return {"Hello": "全源灵动 Backend"} async def serve_webui_path(full_path: str, request: Request): @@ -193,7 +193,7 @@ def test_clickhouse(): return {"status": "success", "message": "Connected to ClickHouse"} raise HTTPException(status_code=500, detail="Failed to connect to ClickHouse") -@app.get("/nanobot/status") +@app.get("/agent-core/status") def nanobot_status(): if nanobot_service.agent: return {"status": "running", "model": nanobot_service.agent.model} @@ -239,7 +239,7 @@ def _decode_web_root(token: str) -> Path: return Path(decoded) -@app.get("/nanobot/artifacts/download") +@app.get("/agent-core/artifacts/download") def download_artifact(target: str = Query(...)): resolved = _resolve_checked_target(target) return FileResponse( @@ -249,7 +249,7 @@ def download_artifact(target: str = Query(...)): ) -@app.get("/nanobot/artifacts/preview") +@app.get("/agent-core/artifacts/preview") def preview_artifact(target: str = Query(...)): resolved = _resolve_checked_target(target) mime_type = _guess_mime_type(resolved) @@ -259,7 +259,7 @@ def preview_artifact(target: str = Query(...)): if suffix in {".html", ".htm"}: root_token = _encode_web_root(Path(resolved).parent) entry = Path(resolved).name - return RedirectResponse(url=f"/nanobot/artifacts/web/{root_token}/{entry}", status_code=307) + return RedirectResponse(url=f"/agent-core/artifacts/web/{root_token}/{entry}", status_code=307) return FileResponse( path=str(resolved), media_type=mime_type, @@ -268,7 +268,7 @@ def preview_artifact(target: str = Query(...)): ) -@app.get("/nanobot/artifacts/web/{root_token}/{resource_path:path}") +@app.get("/agent-core/artifacts/web/{root_token}/{resource_path:path}") def preview_web_artifact_resource(root_token: str, resource_path: str): root_dir = _decode_web_root(root_token) try: @@ -459,7 +459,7 @@ def _extract_reasoning_content(session_messages: List[Dict[str, Any]]) -> str: break return "" -@app.post("/nanobot/chat") +@app.post("/agent-core/chat") async def nanobot_chat(request: ChatRequest): try: _sync_session_project(request.session_id, request.project_id) @@ -539,7 +539,7 @@ async def nanobot_chat(request: ChatRequest): except Exception as e: raise HTTPException(status_code=500, detail=str(e)) -@app.post("/nanobot/chat/stream") +@app.post("/agent-core/chat/stream") async def nanobot_chat_stream(request: ChatRequest): async def event_generator(): current_task = None @@ -735,14 +735,14 @@ async def nanobot_chat_stream(request: ChatRequest): }, ) -@app.get("/nanobot/sessions") +@app.get("/agent-core/sessions") def get_sessions(project_id: Optional[int] = None): if not nanobot_service.agent: return session_alias_store.list_cached_sessions(project_id=project_id) sessions = nanobot_service.agent.sessions.list_sessions() return session_alias_store.sync_and_list(sessions, project_id=project_id) -@app.get("/nanobot/sessions/{session_id}") +@app.get("/agent-core/sessions/{session_id}") def get_session(session_id: str): if not nanobot_service.agent: raise HTTPException(status_code=400, detail="Nanobot not running") @@ -760,7 +760,7 @@ def get_session(session_id: str): class EnsureSessionRequest(BaseModel): project_id: Optional[int] = None -@app.post("/nanobot/sessions/{session_id}/ensure") +@app.post("/agent-core/sessions/{session_id}/ensure") def ensure_session(session_id: str, request: EnsureSessionRequest = EnsureSessionRequest()): if not nanobot_service.agent: raise HTTPException(status_code=400, detail="Nanobot not running") @@ -784,7 +784,7 @@ def ensure_session(session_id: str, request: EnsureSessionRequest = EnsureSessio "project_id": request.project_id } -@app.delete("/nanobot/sessions/{session_id}") +@app.delete("/agent-core/sessions/{session_id}") def delete_session(session_id: str): if not nanobot_service.agent: raise HTTPException(status_code=400, detail="Nanobot not running") @@ -801,7 +801,7 @@ def delete_session(session_id: str): raise HTTPException(status_code=404, detail="Session not found") -@app.post("/nanobot/sessions/batch-delete") +@app.post("/agent-core/sessions/batch-delete") def batch_delete_sessions(request: BatchDeleteRequest): if not nanobot_service.agent: raise HTTPException(status_code=400, detail="Nanobot not running") @@ -824,7 +824,7 @@ def batch_delete_sessions(request: BatchDeleteRequest): return {"status": "success", "deleted_count": len(deleted_ids), "deleted_ids": deleted_ids} -@app.put("/nanobot/sessions/{session_id}") +@app.put("/agent-core/sessions/{session_id}") def update_session(session_id: str, payload: SessionAliasUpdateRequest): updated = session_alias_store.update_alias_meta( session_key=session_id, @@ -836,7 +836,7 @@ def update_session(session_id: str, payload: SessionAliasUpdateRequest): return {"status": "success", **updated} -@app.put("/nanobot/sessions/{session_id}/context-file") +@app.put("/agent-core/sessions/{session_id}/context-file") def update_session_context_file(session_id: str, payload: SessionFileContextUpdateRequest): if not nanobot_service.agent: raise HTTPException(status_code=400, detail="Nanobot not running") diff --git a/backend/pyproject.toml b/dataclaw-api/pyproject.toml similarity index 92% rename from backend/pyproject.toml rename to dataclaw-api/pyproject.toml index a217b22..f2eb2b8 100644 --- a/backend/pyproject.toml +++ b/dataclaw-api/pyproject.toml @@ -32,6 +32,8 @@ dependencies = [ "passlib>=1.7.4", "prompt-toolkit>=3.0.50,<4.0.0", "psycopg2-binary>=2.9.11", + "pymysql>=1.1.3", + "cryptography>=42.0.0", "pydantic>=2.12.0,<3.0.0", "pydantic-settings>=2.12.0,<3.0.0", "pypdf2>=3.0.0", @@ -61,7 +63,7 @@ dependencies = [ [project.scripts] dataclaw = "app.cli:app" -nanobot = "nanobot.cli.commands:app" +nanobot = "agent-core.nanobot.cli.commands:app" [build-system] requires = ["hatchling"] @@ -80,3 +82,9 @@ packages = ["app"] [tool.hatch.build.hooks.custom] path = "hatch_build.py" +[dependency-groups] +dev = [ + "pytest>=9.0.3", + "pytest-asyncio>=1.3.0", +] + diff --git a/backend/tests/test_a2a_backend.py b/dataclaw-api/tests/test_a2a_backend.py similarity index 100% rename from backend/tests/test_a2a_backend.py rename to dataclaw-api/tests/test_a2a_backend.py diff --git a/backend/tests/test_artifact_endpoints.py b/dataclaw-api/tests/test_artifact_endpoints.py similarity index 100% rename from backend/tests/test_artifact_endpoints.py rename to dataclaw-api/tests/test_artifact_endpoints.py diff --git a/backend/tests/test_artifacts.py b/dataclaw-api/tests/test_artifacts.py similarity index 100% rename from backend/tests/test_artifacts.py rename to dataclaw-api/tests/test_artifacts.py diff --git a/backend/tests/test_chat_project_id.py b/dataclaw-api/tests/test_chat_project_id.py similarity index 100% rename from backend/tests/test_chat_project_id.py rename to dataclaw-api/tests/test_chat_project_id.py diff --git a/backend/tests/test_data_root.py b/dataclaw-api/tests/test_data_root.py similarity index 100% rename from backend/tests/test_data_root.py rename to dataclaw-api/tests/test_data_root.py diff --git a/backend/tests/test_dataclaw_cli.py b/dataclaw-api/tests/test_dataclaw_cli.py similarity index 100% rename from backend/tests/test_dataclaw_cli.py rename to dataclaw-api/tests/test_dataclaw_cli.py diff --git a/backend/tests/test_knowledge_base_backend.py b/dataclaw-api/tests/test_knowledge_base_backend.py similarity index 100% rename from backend/tests/test_knowledge_base_backend.py rename to dataclaw-api/tests/test_knowledge_base_backend.py diff --git a/backend/tests/test_nanobot_project_resolution.py b/dataclaw-api/tests/test_nanobot_project_resolution.py similarity index 100% rename from backend/tests/test_nanobot_project_resolution.py rename to dataclaw-api/tests/test_nanobot_project_resolution.py diff --git a/backend/tests/test_nl2sql.py b/dataclaw-api/tests/test_nl2sql.py similarity index 100% rename from backend/tests/test_nl2sql.py rename to dataclaw-api/tests/test_nl2sql.py diff --git a/dataclaw-api/tests/test_nl2sql_optimized.py b/dataclaw-api/tests/test_nl2sql_optimized.py new file mode 100644 index 0000000..fea7e11 --- /dev/null +++ b/dataclaw-api/tests/test_nl2sql_optimized.py @@ -0,0 +1,68 @@ +import pytest +import json +from unittest.mock import AsyncMock, MagicMock, patch +from app.agent.nl2sql import process_nl2sql, NL2SQLRequest, NL2SQLResponse + +@pytest.mark.asyncio +async def test_nl2sql_optimized_flow(): + # Mock parameters + query = "Show me the top 5 sales" + source = "ds:1" + + # Mock connector and schema + mock_connector = MagicMock() + mock_connector.get_schema.return_value = { + "sales": {"columns": [{"name": "id", "type": "INT"}, {"name": "amount", "type": "DECIMAL"}]}, + "users": {"columns": [{"name": "id", "type": "INT"}, {"name": "name", "type": "TEXT"}]}, + "logs": {"columns": [{"name": "id", "type": "INT"}, {"name": "event", "type": "TEXT"}]}, + "products": {"columns": [{"name": "id", "type": "INT"}]}, + "categories": {"columns": [{"name": "id", "type": "INT"}]}, + "inventory": {"columns": [{"name": "id", "type": "INT"}]} + } + mock_connector.test_connection.return_value = True + mock_connector.execute_query.return_value = [{"id": 1, "amount": 100}] + + # Mock LLM provider + mock_provider = AsyncMock() + + # First response for Table Selector + mock_resp_tables = MagicMock() + mock_resp_tables.content = '["sales"]' + mock_resp_tables.finish_reason = "stop" + + # Second response for SQL Generation + mock_resp_sql = MagicMock() + mock_resp_sql.content = '{"reasoning": "Plan...", "sql": "SELECT * FROM sales LIMIT 5"}' + mock_resp_sql.finish_reason = "stop" + + mock_provider.chat.side_effect = [mock_resp_tables, mock_resp_sql] + + # Patch dependencies + with patch("app.agent.nl2sql.get_active_llm_config", return_value={"model": "gpt-4"}), \ + patch("app.agent.nl2sql.build_llm_provider", return_value=mock_provider), \ + patch("app.agent.nl2sql.get_connector", return_value=mock_connector), \ + patch("app.agent.nl2sql.SessionLocal"), \ + patch("app.agent.nl2sql.DataSource"), \ + patch("app.agent.nl2sql.postgres_connector", mock_connector), \ + patch("app.agent.nl2sql._check_connection_with_cache", return_value=True): + + request = NL2SQLRequest(query=query, source=source) + response = await process_nl2sql(request) + + print(f"DEBUG: Response SQL: '{response.sql}'") + print(f"DEBUG: Response Error: '{response.error}'") + + assert response.sql == "SELECT * FROM sales LIMIT 5" + assert len(response.result) == 1 + assert response.error is None + + # Verify provider was called twice + assert mock_provider.chat.call_count == 2 + + # Verify first call was for table selection + args, kwargs = mock_provider.chat.call_args_list[0] + assert "TABLE_SELECTOR_SYSTEM_PROMPT" in str(args) or "Identifying relevant tables" in str(args) or any("system" in m["role"] for m in kwargs["messages"]) + +if __name__ == "__main__": + import asyncio + asyncio.run(test_nl2sql_optimized_flow()) diff --git a/backend/tests/test_patched_openai_compat_provider.py b/dataclaw-api/tests/test_patched_openai_compat_provider.py similarity index 100% rename from backend/tests/test_patched_openai_compat_provider.py rename to dataclaw-api/tests/test_patched_openai_compat_provider.py diff --git a/backend/tests/test_subagent_detail_route.py b/dataclaw-api/tests/test_subagent_detail_route.py similarity index 100% rename from backend/tests/test_subagent_detail_route.py rename to dataclaw-api/tests/test_subagent_detail_route.py diff --git a/backend/tests/test_subagent_tools_e2e_regression.py b/dataclaw-api/tests/test_subagent_tools_e2e_regression.py similarity index 100% rename from backend/tests/test_subagent_tools_e2e_regression.py rename to dataclaw-api/tests/test_subagent_tools_e2e_regression.py diff --git a/backend/tests/test_trace_integration.py b/dataclaw-api/tests/test_trace_integration.py similarity index 100% rename from backend/tests/test_trace_integration.py rename to dataclaw-api/tests/test_trace_integration.py diff --git a/backend/tests/test_webui_static_hosting.py b/dataclaw-api/tests/test_webui_static_hosting.py similarity index 100% rename from backend/tests/test_webui_static_hosting.py rename to dataclaw-api/tests/test_webui_static_hosting.py diff --git a/backend/uv.lock b/dataclaw-api/uv.lock similarity index 99% rename from backend/uv.lock rename to dataclaw-api/uv.lock index 3246f84..12e471e 100644 --- a/backend/uv.lock +++ b/dataclaw-api/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.11" resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'win32'", @@ -669,6 +669,7 @@ dependencies = [ { name = "chardet" }, { name = "clickhouse-driver" }, { name = "croniter" }, + { name = "cryptography" }, { name = "ddgs" }, { name = "dingtalk-stream" }, { name = "duckdb" }, @@ -693,6 +694,7 @@ dependencies = [ { name = "psycopg2-binary" }, { name = "pydantic" }, { name = "pydantic-settings" }, + { name = "pymysql" }, { name = "pypdf2" }, { name = "python-docx" }, { name = "python-dotenv" }, @@ -718,6 +720,12 @@ dependencies = [ { name = "websockets" }, ] +[package.dev-dependencies] +dev = [ + { name = "pytest" }, + { name = "pytest-asyncio" }, +] + [package.metadata] requires-dist = [ { name = "anthropic", specifier = ">=0.45.0,<1.0.0" }, @@ -725,6 +733,7 @@ requires-dist = [ { name = "chardet", specifier = ">=3.0.2,<6.0.0" }, { name = "clickhouse-driver", specifier = ">=0.2.10" }, { name = "croniter", specifier = ">=6.0.0,<7.0.0" }, + { name = "cryptography", specifier = ">=42.0.0" }, { name = "ddgs", specifier = ">=9.5.5,<10.0.0" }, { name = "dingtalk-stream", specifier = ">=0.24.0,<1.0.0" }, { name = "duckdb", specifier = ">=1.5.0" }, @@ -749,6 +758,7 @@ requires-dist = [ { name = "psycopg2-binary", specifier = ">=2.9.11" }, { name = "pydantic", specifier = ">=2.12.0,<3.0.0" }, { name = "pydantic-settings", specifier = ">=2.12.0,<3.0.0" }, + { name = "pymysql", specifier = ">=1.1.3" }, { name = "pypdf2", specifier = ">=3.0.0" }, { name = "python-docx", specifier = ">=1.2.0" }, { name = "python-dotenv", specifier = ">=1.0.1" }, @@ -774,6 +784,12 @@ requires-dist = [ { name = "websockets", specifier = ">=16.0,<17.0" }, ] +[package.metadata.requires-dev] +dev = [ + { name = "pytest", specifier = ">=9.0.3" }, + { name = "pytest-asyncio", specifier = ">=1.3.0" }, +] + [[package]] name = "ddgs" version = "9.12.0" @@ -1207,6 +1223,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, ] +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + [[package]] name = "jinja2" version = "3.1.6" @@ -2370,6 +2395,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868", size = 21216, upload-time = "2026-03-05T18:34:12.172Z" }, ] +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + [[package]] name = "primp" version = "1.2.0" @@ -2783,6 +2817,15 @@ crypto = [ { name = "cryptography" }, ] +[[package]] +name = "pymysql" +version = "1.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/ec/8d45c920e90445f0b75c590b32851853ed319763b0d8dff8d283052da8cf/pymysql-1.1.3.tar.gz", hash = "sha256:e70ebf2047a4edf6138cf79c68ad418ef620af65900aa585c5e8bfc95044d43a", size = 48207, upload-time = "2026-05-01T09:09:54.532Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/dc/9085f3d6f497e9b25fb40d6e8ecef3ddbb5cf977a949b933624a299f5c16/pymysql-1.1.3-py3-none-any.whl", hash = "sha256:8164ba62c552f6105f3b11753352d0f16b90d1703ba67d81923d5a8a5d1c5289", size = 45356, upload-time = "2026-05-01T09:09:53.316Z" }, +] + [[package]] name = "pypdf2" version = "3.0.1" @@ -2792,6 +2835,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8e/5e/c86a5643653825d3c913719e788e41386bee415c2b87b4f955432f2de6b2/pypdf2-3.0.1-py3-none-any.whl", hash = "sha256:d16e4205cfee272fbdc0568b68d82be796540b1537508cef59388f839c191928", size = 232572, upload-time = "2022-12-31T10:36:10.327Z" }, ] +[[package]] +name = "pytest" +version = "9.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, +] + +[[package]] +name = "pytest-asyncio" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087, upload-time = "2025-11-10T16:07:47.256Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" diff --git a/frontend/.gitignore b/dataclaw-ui/.gitignore similarity index 100% rename from frontend/.gitignore rename to dataclaw-ui/.gitignore diff --git a/dataclaw-ui/Dockerfile b/dataclaw-ui/Dockerfile new file mode 100644 index 0000000..d4138cc --- /dev/null +++ b/dataclaw-ui/Dockerfile @@ -0,0 +1,16 @@ +# Frontend Dockerfile +FROM node:20-slim AS build + +WORKDIR /app + +COPY package*.json ./ +RUN npm install + +COPY . . +RUN npm run build + +FROM nginx:stable-alpine +COPY --from=build /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] diff --git a/frontend/README.md b/dataclaw-ui/README.md similarity index 100% rename from frontend/README.md rename to dataclaw-ui/README.md diff --git a/frontend/components.json b/dataclaw-ui/components.json similarity index 100% rename from frontend/components.json rename to dataclaw-ui/components.json diff --git a/frontend/eslint.config.js b/dataclaw-ui/eslint.config.js similarity index 100% rename from frontend/eslint.config.js rename to dataclaw-ui/eslint.config.js diff --git a/frontend/index.html b/dataclaw-ui/index.html similarity index 96% rename from frontend/index.html rename to dataclaw-ui/index.html index 1c30fb6..ed3afb7 100644 --- a/frontend/index.html +++ b/dataclaw-ui/index.html @@ -4,7 +4,7 @@ -