foxclaw 0.1.0 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -29
- package/bin/foxclaw.cjs +51 -0
- package/index.js +4 -10
- package/package.json +46 -38
- package/python/.dockerignore +35 -0
- package/python/.env.example +173 -0
- package/python/.gitattributes +46 -0
- package/python/.github/workflows/ci.yml +167 -0
- package/python/.github/workflows/release.yml +183 -0
- package/python/CHANGELOG.md +57 -0
- package/python/CHANGELOG_CN.md +57 -0
- package/python/Dockerfile +64 -0
- package/python/LICENSE +21 -0
- package/python/MANIFEST.in +14 -0
- package/python/README.md +201 -0
- package/python/README_CN.md +336 -0
- package/python/bench/bm25_audit.py +186 -0
- package/python/bench/bm25_regression.py +177 -0
- package/python/bench/bm25_stress.py +155 -0
- package/python/bench/cd_audit.py +215 -0
- package/python/bench/chaos.py +140 -0
- package/python/bench/concurrency.py +103 -0
- package/python/bench/e2e_real_models.py +94 -0
- package/python/bench/llm_retry_test.py +241 -0
- package/python/bench/load_test.py +193 -0
- package/python/bench/vector_ivf_upgrade.py +128 -0
- package/python/docs/CHANNELS.md +195 -0
- package/python/docs/GOVERNANCE.md +164 -0
- package/python/docs/RELEASE.md +110 -0
- package/python/docs/RUN.md +75 -0
- package/python/docs/RUN_CN.md +121 -0
- package/python/docs//351/205/215/347/275/256/346/214/207/345/215/227.md +152 -0
- package/python/evals/__init__.py +0 -0
- package/python/evals/governance/README.md +61 -0
- package/python/evals/governance/__init__.py +0 -0
- package/python/evals/governance/cases.py +115 -0
- package/python/evals/governance/compare_embeddings.py +94 -0
- package/python/evals/governance/convergence.svg +11 -0
- package/python/evals/governance/report.json +371 -0
- package/python/evals/governance/run_evals.py +368 -0
- package/python/examples/governance_middleware_demo.py +72 -0
- package/python/examples/langgraph_governance_demo.py +104 -0
- package/python/examples/sample_itinerary.csv +6 -0
- package/python/examples/sample_knowledge.csv +9 -0
- package/python/examples/sample_transactions.csv +14 -0
- package/python/foxclaw/__init__.py +408 -0
- package/python/foxclaw/agents/__init__.py +12 -0
- package/python/foxclaw/agents/agents.py +35 -0
- package/python/foxclaw/agents/base.py +794 -0
- package/python/foxclaw/agents/impl/__init__.py +1 -0
- package/python/foxclaw/agents/impl/_helpers.py +70 -0
- package/python/foxclaw/agents/impl/finance.py +231 -0
- package/python/foxclaw/agents/impl/office.py +350 -0
- package/python/foxclaw/agents/impl/supervisor.py +592 -0
- package/python/foxclaw/agents/mixins/_context.py +128 -0
- package/python/foxclaw/agents/mixins/augment.py +143 -0
- package/python/foxclaw/agents/mixins/llm.py +67 -0
- package/python/foxclaw/agents/mixins/memory.py +41 -0
- package/python/foxclaw/agents/mixins/preference.py +131 -0
- package/python/foxclaw/agents/mixins/prompt.py +71 -0
- package/python/foxclaw/agents/mixins/skillbox.py +58 -0
- package/python/foxclaw/agents/mixins/tool_exec.py +417 -0
- package/python/foxclaw/api/__init__.py +224 -0
- package/python/foxclaw/api/_state.py +43 -0
- package/python/foxclaw/api/bootstrap.py +96 -0
- package/python/foxclaw/api/middleware.py +294 -0
- package/python/foxclaw/api/routes/ahs.py +404 -0
- package/python/foxclaw/api/routes/attachments.py +116 -0
- package/python/foxclaw/api/routes/browser.py +35 -0
- package/python/foxclaw/api/routes/domain.py +306 -0
- package/python/foxclaw/api/routes/knowledge.py +145 -0
- package/python/foxclaw/api/routes/llm_admin.py +449 -0
- package/python/foxclaw/api/routes/memory.py +105 -0
- package/python/foxclaw/api/routes/orchestration.py +39 -0
- package/python/foxclaw/api/routes/recovery.py +44 -0
- package/python/foxclaw/api/routes/review.py +266 -0
- package/python/foxclaw/api/routes/search.py +33 -0
- package/python/foxclaw/api/routes/system.py +311 -0
- package/python/foxclaw/api/routes/task.py +263 -0
- package/python/foxclaw/api/routes/ws.py +64 -0
- package/python/foxclaw/api/spine.py +52 -0
- package/python/foxclaw/browser/__init__.py +13 -0
- package/python/foxclaw/browser/action/__init__.py +1 -0
- package/python/foxclaw/browser/action/action_executor.py +50 -0
- package/python/foxclaw/browser/action/action_types.py +44 -0
- package/python/foxclaw/browser/action/action_verifier.py +68 -0
- package/python/foxclaw/browser/action/url_policy.py +143 -0
- package/python/foxclaw/browser/adapter/__init__.py +1 -0
- package/python/foxclaw/browser/adapter/base_adapter.py +23 -0
- package/python/foxclaw/browser/adapter/web_adapter.py +46 -0
- package/python/foxclaw/browser/driver/__init__.py +1 -0
- package/python/foxclaw/browser/driver/base_driver.py +61 -0
- package/python/foxclaw/browser/driver/playwright_driver.py +170 -0
- package/python/foxclaw/browser/perception/__init__.py +1 -0
- package/python/foxclaw/browser/perception/dom_extractor.py +42 -0
- package/python/foxclaw/browser/perception/element_indexer.py +56 -0
- package/python/foxclaw/browser/perception/semantic_reducer.py +33 -0
- package/python/foxclaw/browser/perception/snapshot.py +29 -0
- package/python/foxclaw/browser/service.py +144 -0
- package/python/foxclaw/browser/session/__init__.py +1 -0
- package/python/foxclaw/browser/session/session_manager.py +57 -0
- package/python/foxclaw/capability/__init__.py +12 -0
- package/python/foxclaw/capability/embedding_service.py +65 -0
- package/python/foxclaw/channels/__init__.py +138 -0
- package/python/foxclaw/channels/discord.py +175 -0
- package/python/foxclaw/channels/dispatcher.py +179 -0
- package/python/foxclaw/channels/feishu.py +215 -0
- package/python/foxclaw/channels/openclaw_bridge.py +151 -0
- package/python/foxclaw/channels/signing.py +187 -0
- package/python/foxclaw/channels/telegram.py +120 -0
- package/python/foxclaw/channels/weixin.py +215 -0
- package/python/foxclaw/cli.py +183 -0
- package/python/foxclaw/cognitive/__init__.py +4 -0
- package/python/foxclaw/cognitive/reasoner.py +81 -0
- package/python/foxclaw/cognitive/state.py +141 -0
- package/python/foxclaw/core/__init__.py +9 -0
- package/python/foxclaw/core/audit_chain.py +131 -0
- package/python/foxclaw/core/audit_sink.py +100 -0
- package/python/foxclaw/core/compaction.py +265 -0
- package/python/foxclaw/core/config.py +65 -0
- package/python/foxclaw/core/confirm_nonce.py +151 -0
- package/python/foxclaw/core/dispatch.py +27 -0
- package/python/foxclaw/core/envfile.py +48 -0
- package/python/foxclaw/core/failure_policy.py +142 -0
- package/python/foxclaw/core/gateway.py +81 -0
- package/python/foxclaw/core/governance_audit.py +171 -0
- package/python/foxclaw/core/idempotency.py +282 -0
- package/python/foxclaw/core/injection_guard.py +202 -0
- package/python/foxclaw/core/memory_adapter.py +489 -0
- package/python/foxclaw/core/metrics.py +88 -0
- package/python/foxclaw/core/model_router.py +985 -0
- package/python/foxclaw/core/paths.py +103 -0
- package/python/foxclaw/core/recovery.py +349 -0
- package/python/foxclaw/core/scheduler.py +141 -0
- package/python/foxclaw/core/secrets.py +131 -0
- package/python/foxclaw/core/sessions.py +155 -0
- package/python/foxclaw/core/settings.py +414 -0
- package/python/foxclaw/core/shared_write.py +186 -0
- package/python/foxclaw/core/steering_queue.py +154 -0
- package/python/foxclaw/core/system_bus.py +84 -0
- package/python/foxclaw/core/thought_chain.py +316 -0
- package/python/foxclaw/core/token_meter.py +231 -0
- package/python/foxclaw/core/tools.py +164 -0
- package/python/foxclaw/core/tracing.py +375 -0
- package/python/foxclaw/core/truth_pipeline.py +110 -0
- package/python/foxclaw/core/update_check.py +149 -0
- package/python/foxclaw/core/vec_recall_adapter.py +477 -0
- package/python/foxclaw/core/verify.py +173 -0
- package/python/foxclaw/core/web_search.py +218 -0
- package/python/foxclaw/finance/__init__.py +15 -0
- package/python/foxclaw/finance/evidence.py +149 -0
- package/python/foxclaw/finance/fx.py +98 -0
- package/python/foxclaw/finance/graph.py +179 -0
- package/python/foxclaw/finance/models.py +146 -0
- package/python/foxclaw/finance/nlparse.py +515 -0
- package/python/foxclaw/finance/policy.py +301 -0
- package/python/foxclaw/finance/reasoner.py +121 -0
- package/python/foxclaw/finance/reasoning.py +319 -0
- package/python/foxclaw/finance/reconcile.py +175 -0
- package/python/foxclaw/finance/runtime.py +500 -0
- package/python/foxclaw/governance/__init__.py +24 -0
- package/python/foxclaw/governance/middleware.py +176 -0
- package/python/foxclaw/harness/__init__.py +17 -0
- package/python/foxclaw/harness/_base.py +66 -0
- package/python/foxclaw/harness/_policy.py +340 -0
- package/python/foxclaw/harness/drift.py +77 -0
- package/python/foxclaw/harness/event_bus.py +28 -0
- package/python/foxclaw/harness/harness.py +358 -0
- package/python/foxclaw/harness/loop_detection.py +145 -0
- package/python/foxclaw/itinerary/__init__.py +10 -0
- package/python/foxclaw/itinerary/amap_client.py +114 -0
- package/python/foxclaw/itinerary/models.py +80 -0
- package/python/foxclaw/itinerary/reasoner.py +96 -0
- package/python/foxclaw/itinerary/reasoning.py +168 -0
- package/python/foxclaw/itinerary/runtime.py +144 -0
- package/python/foxclaw/kernel/__init__.py +13 -0
- package/python/foxclaw/kernel/capabilities.py +72 -0
- package/python/foxclaw/kernel/policy_gate.py +108 -0
- package/python/foxclaw/kernel/process_manager.py +186 -0
- package/python/foxclaw/kernel/scheduler.py +125 -0
- package/python/foxclaw/kernel/sentinel.py +443 -0
- package/python/foxclaw/kernel/sentinel_client.py +243 -0
- package/python/foxclaw/kernel/spine.py +97 -0
- package/python/foxclaw/knowledge/__init__.py +360 -0
- package/python/foxclaw/knowledge/truth_crystallizer.py +89 -0
- package/python/foxclaw/learning/__init__.py +12 -0
- package/python/foxclaw/learning/knowledge_graph.py +144 -0
- package/python/foxclaw/learning/models.py +93 -0
- package/python/foxclaw/learning/reasoner.py +67 -0
- package/python/foxclaw/learning/runtime.py +351 -0
- package/python/foxclaw/learning/spaced_repetition.py +91 -0
- package/python/foxclaw/mcp_server.py +188 -0
- package/python/foxclaw/orchestration/__init__.py +167 -0
- package/python/foxclaw/pipeline/__init__.py +23 -0
- package/python/foxclaw/pipeline/cognitive_pipeline.py +429 -0
- package/python/foxclaw/pipeline/stage_meta.py +21 -0
- package/python/foxclaw/pipeline/supervisor_stages.py +201 -0
- package/python/foxclaw/planning/__init__.py +17 -0
- package/python/foxclaw/planning/llm_planner.py +232 -0
- package/python/foxclaw/planning/planner.py +94 -0
- package/python/foxclaw/search/__init__.py +24 -0
- package/python/foxclaw/search/agent_port.py +190 -0
- package/python/foxclaw/search/evidence.py +109 -0
- package/python/foxclaw/search/external_search.py +50 -0
- package/python/foxclaw/search/hkc_read_port.py +60 -0
- package/python/foxclaw/search/internal_search.py +71 -0
- package/python/foxclaw/search/models.py +127 -0
- package/python/foxclaw/search/planner.py +44 -0
- package/python/foxclaw/search/retriever.py +39 -0
- package/python/foxclaw/search/runtime.py +127 -0
- package/python/foxclaw/search/strategy.py +44 -0
- package/python/foxclaw/skills/__init__.py +559 -0
- package/python/foxclaw/skills/archive.py +111 -0
- package/python/foxclaw/skills/fetch.py +226 -0
- package/python/foxclaw/skills/hooks_spec.py +69 -0
- package/python/foxclaw/skills/install_cmd.py +216 -0
- package/python/foxclaw/skills/lifecycle.py +252 -0
- package/python/foxclaw/skills/markdown_skill.py +175 -0
- package/python/foxclaw/skills/markdown_store.py +39 -0
- package/python/foxclaw/skills/mcp_client.py +184 -0
- package/python/foxclaw/skills/mcp_store.py +40 -0
- package/python/foxclaw/skills/permission.py +145 -0
- package/python/foxclaw/skills/pipeline.py +354 -0
- package/python/foxclaw/skills/policy.py +74 -0
- package/python/foxclaw/skills/review.py +72 -0
- package/python/foxclaw/skills/store.py +57 -0
- package/python/frontend/assets/core_bg.jpg +0 -0
- package/python/frontend/deck/auth.js +25 -0
- package/python/frontend/deck/chat_model_picker.js +483 -0
- package/python/frontend/deck/domain.js +276 -0
- package/python/frontend/deck/main.js +1806 -0
- package/python/frontend/deck/markdown.js +44 -0
- package/python/frontend/deck/settings.js +307 -0
- package/python/frontend/deck/state.js +5 -0
- package/python/frontend/deck/util.js +4 -0
- package/python/frontend/deck/visuals.js +190 -0
- package/python/frontend/deck.css +855 -0
- package/python/frontend/deck.html +686 -0
- package/python/frontend/deck_v2.html +341 -0
- package/python/frontend/planet/index.html +266 -0
- package/python/frontend/planet/planet.css +579 -0
- package/python/frontend/planet/planet.js +1436 -0
- package/python/frontend/planet/vendor/three.core.min.js +6 -0
- package/python/frontend/planet/vendor/three.module.min.js +6 -0
- package/python/frontend/v3/assets/index-CQSBdxk4.js +34 -0
- package/python/frontend/v3/assets/index-D5nIsjms.css +1 -0
- package/python/frontend/v3/index.html +15 -0
- package/python/frontend/widget_runtime.js +252 -0
- package/python/frontend/widgets.js +639 -0
- package/python/frontend_src/index.html +14 -0
- package/python/frontend_src/package-lock.json +1376 -0
- package/python/frontend_src/package.json +19 -0
- package/python/frontend_src/src/App.vue +58 -0
- package/python/frontend_src/src/api.js +82 -0
- package/python/frontend_src/src/components/ChatDock.vue +365 -0
- package/python/frontend_src/src/components/ComposerMenu.vue +75 -0
- package/python/frontend_src/src/components/DocViewer.vue +162 -0
- package/python/frontend_src/src/components/Inspector.vue +235 -0
- package/python/frontend_src/src/components/LeftRail.vue +415 -0
- package/python/frontend_src/src/components/MenuPopover.vue +128 -0
- package/python/frontend_src/src/components/MessageStream.vue +389 -0
- package/python/frontend_src/src/components/ModelPicker.vue +350 -0
- package/python/frontend_src/src/components/QuickIngest.vue +112 -0
- package/python/frontend_src/src/components/Stage.vue +272 -0
- package/python/frontend_src/src/components/ToolMenu.vue +141 -0
- package/python/frontend_src/src/components/TopBar.vue +118 -0
- package/python/frontend_src/src/components/panels/ActivityPanel.vue +82 -0
- package/python/frontend_src/src/components/panels/AgentsPanel.vue +83 -0
- package/python/frontend_src/src/components/panels/KnowledgePanel.vue +425 -0
- package/python/frontend_src/src/components/panels/MemoryPanel.vue +117 -0
- package/python/frontend_src/src/components/panels/PanelBox.vue +50 -0
- package/python/frontend_src/src/components/panels/ReviewPanel.vue +292 -0
- package/python/frontend_src/src/components/panels/SettingsPanel.vue +358 -0
- package/python/frontend_src/src/components/panels/TasksPanel.vue +73 -0
- package/python/frontend_src/src/components/panels/ToolsPanel.vue +746 -0
- package/python/frontend_src/src/components/panels/UsagePanel.vue +105 -0
- package/python/frontend_src/src/lib/fmt.js +44 -0
- package/python/frontend_src/src/lib/i18n.js +53 -0
- package/python/frontend_src/src/lib/locales/en.js +173 -0
- package/python/frontend_src/src/lib/locales/zh.js +174 -0
- package/python/frontend_src/src/lib/md.js +190 -0
- package/python/frontend_src/src/main.js +9 -0
- package/python/frontend_src/src/stores/app.js +91 -0
- package/python/frontend_src/src/stores/chat.js +450 -0
- package/python/frontend_src/src/stores/model.js +96 -0
- package/python/frontend_src/src/stores/panels.js +289 -0
- package/python/frontend_src/src/stores/profile.js +31 -0
- package/python/frontend_src/src/stores/system.js +25 -0
- package/python/frontend_src/src/styles/base.css +138 -0
- package/python/frontend_src/src/styles/panel.css +117 -0
- package/python/frontend_src/src/styles/tokens.css +78 -0
- package/python/frontend_src/vite.config.js +39 -0
- package/python/pyproject.toml +268 -0
- package/python/requirements.txt +311 -0
- package/python/skills/README.md +123 -0
- package/python/skills/execution-contract/SKILL.md +30 -0
- package/python/skills/general-assistant/SKILL.md +34 -0
- package/python/skills/planner/SKILL.md +33 -0
- package/python/skills/schedule-itinerary/SKILL.md +35 -0
- package/python/skills/skill-composition/SKILL.md +31 -0
- package/python/skills/skill-guard/SKILL.md +67 -0
- package/python/skills/skill-memory/SKILL.md +50 -0
- package/python/skills/skill-router/SKILL.md +35 -0
- package/python/tests/conftest.py +54 -0
- package/python/tests/run_all.py +200 -0
- package/python/tests/test_agent_lifecycle.py +326 -0
- package/python/tests/test_ahs_p2.py +393 -0
- package/python/tests/test_anthropic_tools.py +192 -0
- package/python/tests/test_api.py +97 -0
- package/python/tests/test_api_auth.py +79 -0
- package/python/tests/test_api_host_guard.py +69 -0
- package/python/tests/test_attachments.py +151 -0
- package/python/tests/test_audit_chain.py +116 -0
- package/python/tests/test_audit_sink.py +130 -0
- package/python/tests/test_browser.py +149 -0
- package/python/tests/test_browser_request_guard.py +180 -0
- package/python/tests/test_capabilities.py +152 -0
- package/python/tests/test_channel_signing.py +185 -0
- package/python/tests/test_channel_trust.py +109 -0
- package/python/tests/test_channels.py +174 -0
- package/python/tests/test_cli.py +46 -0
- package/python/tests/test_compaction_toolpair.py +119 -0
- package/python/tests/test_config_layering.py +61 -0
- package/python/tests/test_confirm_nonce.py +186 -0
- package/python/tests/test_context_compaction_wiring.py +124 -0
- package/python/tests/test_dispatch.py +89 -0
- package/python/tests/test_domain_evals.py +334 -0
- package/python/tests/test_domain_import.py +72 -0
- package/python/tests/test_domain_reasoners.py +134 -0
- package/python/tests/test_e2e.py +161 -0
- package/python/tests/test_emb_cache.py +97 -0
- package/python/tests/test_embedding_singleton.py +87 -0
- package/python/tests/test_envfile.py +83 -0
- package/python/tests/test_evals_smoke.py +90 -0
- package/python/tests/test_event_spine.py +174 -0
- package/python/tests/test_evidence_semantic.py +88 -0
- package/python/tests/test_evidence_sse.py +94 -0
- package/python/tests/test_file_ingest.py +135 -0
- package/python/tests/test_finance.py +144 -0
- package/python/tests/test_finance_ledger.py +245 -0
- package/python/tests/test_finance_persist.py +174 -0
- package/python/tests/test_gateway.py +125 -0
- package/python/tests/test_governance.py +421 -0
- package/python/tests/test_governance_audit.py +324 -0
- package/python/tests/test_governance_middleware.py +137 -0
- package/python/tests/test_hkc.py +268 -0
- package/python/tests/test_hkc_index_build_manager.py +306 -0
- package/python/tests/test_hkc_manifest_reuse.py +294 -0
- package/python/tests/test_hkc_search_event_sync.py +482 -0
- package/python/tests/test_import_path_guard.py +155 -0
- package/python/tests/test_injection_guard.py +193 -0
- package/python/tests/test_integration.py +117 -0
- package/python/tests/test_itinerary.py +100 -0
- package/python/tests/test_kee_semantic.py +84 -0
- package/python/tests/test_kernel.py +212 -0
- package/python/tests/test_learning.py +101 -0
- package/python/tests/test_llm_admin.py +145 -0
- package/python/tests/test_llm_planner.py +344 -0
- package/python/tests/test_markdown_skills.py +62 -0
- package/python/tests/test_markdown_skills_openclaw.py +66 -0
- package/python/tests/test_mcp_connectors.py +97 -0
- package/python/tests/test_mcp_guardian_discovery.py +87 -0
- package/python/tests/test_mcp_no_memory.py +43 -0
- package/python/tests/test_mcp_policy_gate.py +76 -0
- package/python/tests/test_mcp_server.py +92 -0
- package/python/tests/test_memory_recall.py +92 -0
- package/python/tests/test_metrics.py +58 -0
- package/python/tests/test_multi_chain.py +90 -0
- package/python/tests/test_multimodal.py +122 -0
- package/python/tests/test_negotiation.py +136 -0
- package/python/tests/test_orchestration.py +109 -0
- package/python/tests/test_orchestration_decoupled.py +103 -0
- package/python/tests/test_p3_p5_hardening.py +324 -0
- package/python/tests/test_parallel_dispatch.py +207 -0
- package/python/tests/test_pipeline.py +492 -0
- package/python/tests/test_plan_visible.py +86 -0
- package/python/tests/test_planner.py +88 -0
- package/python/tests/test_policy_gate.py +108 -0
- package/python/tests/test_profile.py +67 -0
- package/python/tests/test_readme_claims.py +163 -0
- package/python/tests/test_reasoner.py +170 -0
- package/python/tests/test_release_check.py +252 -0
- package/python/tests/test_resume_checkpoint.py +148 -0
- package/python/tests/test_routing.py +85 -0
- package/python/tests/test_scheduler.py +138 -0
- package/python/tests/test_search.py +194 -0
- package/python/tests/test_secrets.py +153 -0
- package/python/tests/test_semantic.py +69 -0
- package/python/tests/test_sessions.py +90 -0
- package/python/tests/test_settings.py +265 -0
- package/python/tests/test_shadow_learning.py +290 -0
- package/python/tests/test_shared_write.py +200 -0
- package/python/tests/test_skill_taint_gate.py +145 -0
- package/python/tests/test_skills.py +117 -0
- package/python/tests/test_skills_fetch.py +282 -0
- package/python/tests/test_stats_and_events.py +162 -0
- package/python/tests/test_streaming.py +55 -0
- package/python/tests/test_supervisor_pipeline.py +176 -0
- package/python/tests/test_supervisor_triage.py +102 -0
- package/python/tests/test_taint.py +112 -0
- package/python/tests/test_task_stream.py +74 -0
- package/python/tests/test_thinking_sse.py +66 -0
- package/python/tests/test_thinking_stream.py +76 -0
- package/python/tests/test_tool_center.py +113 -0
- package/python/tests/test_tool_parallel.py +113 -0
- package/python/tests/test_tool_params.py +99 -0
- package/python/tests/test_tool_use.py +229 -0
- package/python/tests/test_toplevel_concurrency.py +116 -0
- package/python/tests/test_tracing.py +256 -0
- package/python/tests/test_truth_crystallizer.py +125 -0
- package/python/tests/test_truth_flow.py +88 -0
- package/python/tests/test_update_check.py +95 -0
- package/python/tests/test_url_policy.py +53 -0
- package/python/tests/test_verify_evidence.py +212 -0
- package/python/tests/test_version_sync.py +100 -0
- package/python/tests/test_web_trigger.py +82 -0
- package/python/tools/check_faiss_type.py +30 -0
- package/python/tools/check_log.ps1 +38 -0
- package/python/tools/ivf_status.py +72 -0
- package/python/tools/mypy_baseline.txt +13 -0
- package/python/tools/mypy_ratchet.py +143 -0
- package/python/tools/pack.py +173 -0
- package/python/tools/release_check.py +349 -0
- package/python/tools/restart_foxclaw.ps1 +71 -0
- package/python/tools/shared_write_audit.py +190 -0
- package/python/tools/size_baseline.txt +28 -0
- package/python/tools/size_check.py +102 -0
- package/python/tools/strip_comments.py +228 -0
- package/python/tools/verify_env.bat +2 -0
- package/python/tools/verify_env.py +25 -0
- package/python/vendor/HMR_LICENSE +37 -0
- package/python/vendor/HMR_README.md +65 -0
- package/python/vendor/hkc/LICENSE +37 -0
- package/python/vendor/hkc/hkc_ace/__init__.py +0 -0
- package/python/vendor/hkc/hkc_ace/ace.py +457 -0
- package/python/vendor/hkc/hkc_ace/skill_taxonomy.json +465 -0
- package/python/vendor/hkc/hkc_api/__init__.py +0 -0
- package/python/vendor/hkc/hkc_api/container.py +416 -0
- package/python/vendor/hkc/hkc_api/ingest_jobs.py +103 -0
- package/python/vendor/hkc/hkc_api/main.py +157 -0
- package/python/vendor/hkc/hkc_api/routes/__init__.py +0 -0
- package/python/vendor/hkc/hkc_api/routes/ability.py +151 -0
- package/python/vendor/hkc/hkc_api/routes/config.py +51 -0
- package/python/vendor/hkc/hkc_api/routes/knowledge.py +630 -0
- package/python/vendor/hkc/hkc_api/routes/search.py +88 -0
- package/python/vendor/hkc/hkc_api/schemas.py +153 -0
- package/python/vendor/hkc/hkc_api/synthesis.py +179 -0
- package/python/vendor/hkc/hkc_core/__init__.py +0 -0
- package/python/vendor/hkc/hkc_core/graph/__init__.py +0 -0
- package/python/vendor/hkc/hkc_core/graph/base.py +188 -0
- package/python/vendor/hkc/hkc_core/graph/sqlite_store.py +789 -0
- package/python/vendor/hkc/hkc_core/models/__init__.py +0 -0
- package/python/vendor/hkc/hkc_core/models/enums.py +65 -0
- package/python/vendor/hkc/hkc_core/models/ku.py +307 -0
- package/python/vendor/hkc/hkc_core/utils/__init__.py +0 -0
- package/python/vendor/hkc/hkc_core/utils/id_gen.py +113 -0
- package/python/vendor/hkc/hkc_crystallizer/__init__.py +44 -0
- package/python/vendor/hkc/hkc_crystallizer/adapters.py +94 -0
- package/python/vendor/hkc/hkc_crystallizer/candidate.py +145 -0
- package/python/vendor/hkc/hkc_crystallizer/crystallizer.py +179 -0
- package/python/vendor/hkc/hkc_crystallizer/ingress.py +90 -0
- package/python/vendor/hkc/hkc_kde/__init__.py +0 -0
- package/python/vendor/hkc/hkc_kde/chunker.py +197 -0
- package/python/vendor/hkc/hkc_kde/extractor.py +623 -0
- package/python/vendor/hkc/hkc_kde/kde.py +298 -0
- package/python/vendor/hkc/hkc_kde/loaders/__init__.py +0 -0
- package/python/vendor/hkc/hkc_kde/loaders/ebook_loader.py +153 -0
- package/python/vendor/hkc/hkc_kde/loaders/office_loader.py +194 -0
- package/python/vendor/hkc/hkc_kde/loaders/pdf_loader.py +162 -0
- package/python/vendor/hkc/hkc_kde/loaders/text_loader.py +157 -0
- package/python/vendor/hkc/hkc_kde/loaders/web_loader.py +91 -0
- package/python/vendor/hkc/hkc_kde/models.py +74 -0
- package/python/vendor/hkc/hkc_kde/packager.py +329 -0
- package/python/vendor/hkc/hkc_kde/relation_disc.py +151 -0
- package/python/vendor/hkc/hkc_kee/__init__.py +0 -0
- package/python/vendor/hkc/hkc_kee/dedup.py +227 -0
- package/python/vendor/hkc/hkc_kee/fingerprint.py +106 -0
- package/python/vendor/hkc/hkc_kee/kee.py +541 -0
- package/python/vendor/hkc/hkc_kep/__init__.py +0 -0
- package/python/vendor/hkc/hkc_kep/event_bus.py +205 -0
- package/python/vendor/hkc/hkc_sdk/__init__.py +63 -0
- package/python/vendor/hkc/hkc_sdk/base.py +151 -0
- package/python/vendor/hkc/hkc_sdk/direct_client.py +153 -0
- package/python/vendor/hkc/hkc_sdk/exceptions.py +39 -0
- package/python/vendor/hkc/hkc_sdk/http_client.py +166 -0
- package/python/vendor/hkc/hkc_sdk/models.py +171 -0
- package/python/vendor/hkc/hkc_search/__init__.py +0 -0
- package/python/vendor/hkc/hkc_search/bm25.py +325 -0
- package/python/vendor/hkc/hkc_search/embedding_backends.py +374 -0
- package/python/vendor/hkc/hkc_search/graph_search.py +132 -0
- package/python/vendor/hkc/hkc_search/hybrid.py +331 -0
- package/python/vendor/hkc/hkc_search/index_build_manager.py +378 -0
- package/python/vendor/hkc/hkc_search/vector_search.py +484 -0
- package/python/vendor/hmr/__init__.py +0 -0
- package/python/vendor/hmr/core/__init__.py +0 -0
- package/python/vendor/hmr/core/hmr.py +684 -0
- package/python/vendor/hmr/core/models.py +310 -0
- package/python/vendor/hmr/engines/__init__.py +0 -0
- package/python/vendor/hmr/engines/evolution.py +710 -0
- package/python/vendor/hmr/engines/jit_compiler.py +472 -0
- package/python/vendor/hmr/engines/lifecycle.py +264 -0
- package/python/vendor/hmr/engines/policy.py +625 -0
- package/python/vendor/hmr/engines/recall.py +260 -0
- package/python/vendor/hmr/engines/runtime_state.py +158 -0
- package/python/vendor/hmr/engines/scheduler.py +323 -0
- package/python/vendor/hmr/engines/semantic.py +150 -0
- package/python/vendor/hmr/engines/temporal.py +261 -0
- package/python/vendor/hmr/engines/thought_chain.py +635 -0
- package/python/vendor/hmr/graph/__init__.py +0 -0
- package/python/vendor/hmr/graph/cwg.py +338 -0
- package/python/vendor/hmr/graph/memory_graph.py +530 -0
- package/python/vendor/hmr/storage/__init__.py +0 -0
- package/python/vendor/hmr/storage/memory_fs.py +300 -0
- package/python/vendor/hmr/storage/vector_store.py +520 -0
|
@@ -0,0 +1,855 @@
|
|
|
1
|
+
/* ═══════════════════════════════════════════════════════════════════════════
|
|
2
|
+
Foxclaw Deck · Apple-design 干净重写(v5.0)
|
|
3
|
+
—— 单一设计系统,无历史叠加。排版尺度 + 空间尺度 + 材质原语,照参考图精致度。
|
|
4
|
+
骨架保留:顶栏 + 左中右三栏 + 底部输入。类名保留(JS 依赖)。
|
|
5
|
+
设计语言:暖灰底 / 纯白悬浮卡 / 大圆角 / 蓝(唯一强调) / 系统字体大标题 / 柔和阴影 / 留白。
|
|
6
|
+
═══════════════════════════════════════════════════════════════════════════ */
|
|
7
|
+
|
|
8
|
+
:root{
|
|
9
|
+
/* 表面 · 三层明度递进(apple 核心):页面底 → 栏板块 → 卡片/按钮 */
|
|
10
|
+
--bg:#e6e2db; /* L1 全页面底色(最深暖灰) */
|
|
11
|
+
--panel:#f2efe9; /* L2 各栏板块底色(中间暖白) */
|
|
12
|
+
--surface:#ffffff; /* L3 卡片/按钮(最亮) */
|
|
13
|
+
--surface-2:#ece8e1; /* 卡内凹陷:pill 轨道 / 输入底 / 图标底 */
|
|
14
|
+
--surface-3:#e0dcd3;
|
|
15
|
+
--glass:rgba(255,255,255,.72); --glass-strong:rgba(255,255,255,.9);
|
|
16
|
+
--line:rgba(0,0,0,.07); --line-soft:rgba(0,0,0,.05);
|
|
17
|
+
/* 文字(apple 灰阶) */
|
|
18
|
+
--ink:#1d1d1f; --dim:#6e6e73; --faint:#a1a1a6;
|
|
19
|
+
/* 强调 + 状态 */
|
|
20
|
+
--accent:#0a84ff; --accent-deep:#0060df; --accent-soft:rgba(10,132,255,.1);
|
|
21
|
+
--green:#1a9d5f; --amber:#c77400; --red:#e5484d;
|
|
22
|
+
/* 半径 · 阴影 · 间距 */
|
|
23
|
+
--r-card:22px; --r-mid:16px; --r-sm:12px; --r-pill:9999px;
|
|
24
|
+
--sh-card:0 1px 2px rgba(0,0,0,.04), 0 10px 28px rgba(0,0,0,.07);
|
|
25
|
+
--sh-pop:0 12px 36px rgba(0,0,0,.16), 0 2px 10px rgba(0,0,0,.08);
|
|
26
|
+
--sh-accent:0 4px 14px rgba(10,132,255,.3);
|
|
27
|
+
--gap:18px; --pad:20px;
|
|
28
|
+
--font:-apple-system,BlinkMacSystemFont,"SF Pro Display","SF Pro Text","Helvetica Neue","PingFang SC","Microsoft YaHei",system-ui,sans-serif;
|
|
29
|
+
--z-panel:10; --z-menu:100; --z-overlay:300; --z-top:500;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
*{margin:0;padding:0;box-sizing:border-box}
|
|
33
|
+
html,body{height:100%;overflow:hidden}
|
|
34
|
+
body{
|
|
35
|
+
font-family:var(--font); color:var(--ink); background:var(--bg);
|
|
36
|
+
-webkit-font-smoothing:antialiased; -moz-osx-font-smoothing:grayscale; text-rendering:optimizeLegibility;
|
|
37
|
+
background-image:
|
|
38
|
+
radial-gradient(1200px 820px at 50% -12%, rgba(255,249,240,.9), transparent 60%),
|
|
39
|
+
radial-gradient(960px 660px at 92% 0%, rgba(216,228,252,.5), transparent 62%),
|
|
40
|
+
radial-gradient(820px 660px at 2% 100%, rgba(255,237,222,.55), transparent 60%);
|
|
41
|
+
background-attachment:fixed;
|
|
42
|
+
}
|
|
43
|
+
::selection{background:var(--accent-soft)}
|
|
44
|
+
canvas.stream-canvas{display:none} /* 去掉数据流层 */
|
|
45
|
+
|
|
46
|
+
/* 细滚动条 */
|
|
47
|
+
*::-webkit-scrollbar{width:9px;height:9px}
|
|
48
|
+
*::-webkit-scrollbar-thumb{background:rgba(0,0,0,.14);border-radius:9px;border:2px solid transparent;background-clip:padding-box}
|
|
49
|
+
*::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,.24);background-clip:padding-box}
|
|
50
|
+
|
|
51
|
+
/* ═══ 原语:pill 按钮 / 卡片 / 玻璃浮层 ═══ */
|
|
52
|
+
.pill,.abtn,.planet-launch,.icobtn{
|
|
53
|
+
display:inline-flex; align-items:center; gap:6px; cursor:pointer; white-space:nowrap;
|
|
54
|
+
font-family:var(--font); font-size:13px; font-weight:600; color:var(--ink);
|
|
55
|
+
background:var(--surface-2); border:1px solid transparent; border-radius:var(--r-pill);
|
|
56
|
+
padding:8px 15px; transition:transform .12s ease, background .16s, box-shadow .16s, border-color .16s;
|
|
57
|
+
}
|
|
58
|
+
.pill:hover,.abtn:hover,.planet-launch:hover,.icobtn:hover{background:#fff;border-color:var(--line);box-shadow:0 1px 3px rgba(0,0,0,.06)}
|
|
59
|
+
.pill:active,.abtn:active,.planet-launch:active,.icobtn:active{transform:scale(.96)}
|
|
60
|
+
|
|
61
|
+
/* ═══ 骨架:顶栏(62) + 三栏主体 ═══ */
|
|
62
|
+
.app{position:relative;z-index:1;height:100vh;display:grid;grid-template-rows:64px 1fr}
|
|
63
|
+
|
|
64
|
+
.topbar{display:flex;align-items:center;gap:16px;padding:0 22px;z-index:var(--z-menu);
|
|
65
|
+
background:var(--glass);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);
|
|
66
|
+
border-bottom:1px solid var(--line)}
|
|
67
|
+
.brand{display:flex;align-items:center;gap:11px}
|
|
68
|
+
.brand .logo{width:34px;height:34px;border-radius:10px;display:grid;place-items:center;
|
|
69
|
+
background:var(--accent);color:#fff;font-weight:800;font-size:18px;box-shadow:var(--sh-accent)}
|
|
70
|
+
.brand h1{font-size:18px;font-weight:700;letter-spacing:-.02em}
|
|
71
|
+
.brand .ver{font-size:10px;font-weight:600;color:var(--accent);background:var(--accent-soft);padding:2px 7px;border-radius:7px;margin-left:2px}
|
|
72
|
+
.greet{flex:1}
|
|
73
|
+
.greet .hi{font-size:20px;font-weight:800;letter-spacing:-.03em;line-height:1.05}
|
|
74
|
+
.greet .hi b{color:var(--accent)}
|
|
75
|
+
.greet .sub{font-size:10px;color:var(--dim);margin-top:2px;letter-spacing:.14em;text-transform:uppercase;font-weight:600}
|
|
76
|
+
.topright{display:flex;align-items:center;gap:10px;margin-left:auto}
|
|
77
|
+
.sysstat{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--dim)}
|
|
78
|
+
.sysstat .bar{width:84px;height:6px;border-radius:3px;background:var(--surface-3);overflow:hidden}
|
|
79
|
+
.sysstat .bar i{display:block;height:100%;background:linear-gradient(90deg,var(--accent),var(--green))}
|
|
80
|
+
.sysstat b{color:var(--green);font-weight:700;font-variant-numeric:tabular-nums}
|
|
81
|
+
.icobtn{width:36px;height:36px;padding:0;justify-content:center;font-size:15px;color:var(--dim)}
|
|
82
|
+
.icobtn:hover{color:var(--accent)}
|
|
83
|
+
.abtn.on,.pill.on{background:var(--accent);color:#fff}
|
|
84
|
+
.avatar-sm{width:36px;height:36px;border-radius:50%;background:linear-gradient(150deg,#b8b5af,#8b887f);border:1px solid var(--line);flex-shrink:0}
|
|
85
|
+
.model-sel{position:relative}
|
|
86
|
+
|
|
87
|
+
/* 主体三栏 —— 架构:左 340 / 中 1fr / 右 340 */
|
|
88
|
+
.body{display:grid;grid-template-columns:340px minmax(0,1fr) 340px;gap:var(--gap);padding:var(--pad);overflow:hidden}
|
|
89
|
+
/* 三栏都是纯白悬浮卡 */
|
|
90
|
+
.nav,.right{display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--line-soft);
|
|
91
|
+
border-radius:var(--r-card);box-shadow:var(--sh-card);padding:16px;overflow:auto;gap:20px}
|
|
92
|
+
.center{display:grid;grid-template-rows:1fr auto;gap:var(--gap);min-height:0;position:relative}
|
|
93
|
+
|
|
94
|
+
/* ═══ 左栏:分段入口 + 信息流卡 ═══ */
|
|
95
|
+
.nav-top{display:flex;gap:4px;padding:4px;background:var(--surface-2);border-radius:var(--r-mid);flex-shrink:0}
|
|
96
|
+
.nav-mini{flex:1;display:flex;flex-direction:column;align-items:center;gap:4px;padding:11px 6px;
|
|
97
|
+
border-radius:12px;cursor:pointer;color:var(--dim);transition:all .16s ease;background:transparent}
|
|
98
|
+
.nav-mini .ic{font-size:17px}
|
|
99
|
+
.nav-mini b{font-size:12px;font-weight:600}
|
|
100
|
+
.nav-mini:hover{color:var(--ink)}
|
|
101
|
+
.nav-mini.on{background:var(--surface);color:var(--ink);box-shadow:0 1px 3px rgba(0,0,0,.08)}
|
|
102
|
+
.nav-mini.on .ic{color:var(--accent)}
|
|
103
|
+
|
|
104
|
+
/* 左栏:OpenClaw 式垂直导航列表 */
|
|
105
|
+
.nav-list{display:flex;flex-direction:column;gap:2px}
|
|
106
|
+
.nav-sec{font-size:10.5px;font-weight:700;letter-spacing:.09em;color:var(--faint);
|
|
107
|
+
padding:15px 12px 5px;text-transform:uppercase;user-select:none}
|
|
108
|
+
.nav-list>.nav-link:first-child{margin-top:0}
|
|
109
|
+
.nav-link{display:flex;align-items:center;gap:11px;min-height:44px;padding:9px 12px;
|
|
110
|
+
border-radius:var(--r-sm);cursor:pointer;color:var(--dim);font-size:14px;font-weight:600;
|
|
111
|
+
transition:background .16s ease,color .16s ease,transform .1s ease}
|
|
112
|
+
.nav-link .ni{width:19px;height:19px;flex-shrink:0;display:grid;place-items:center;color:currentColor}
|
|
113
|
+
.nav-link .ni svg{width:19px;height:19px;stroke:currentColor;fill:none;stroke-width:1.8;
|
|
114
|
+
stroke-linecap:round;stroke-linejoin:round}
|
|
115
|
+
.nav-link:hover{background:var(--surface-2);color:var(--ink)}
|
|
116
|
+
.nav-link.on{background:var(--surface);color:var(--ink);box-shadow:0 1px 3px rgba(0,0,0,.08)}
|
|
117
|
+
.nav-link.on .ni{color:var(--accent)}
|
|
118
|
+
.nav-link:active{transform:scale(.985)}
|
|
119
|
+
.nav-link:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
|
|
120
|
+
|
|
121
|
+
/* 左栏:会话历史为主体(新会话 → 会话列表 → 底部功能菜单按钮) */
|
|
122
|
+
.nav{gap:10px}
|
|
123
|
+
.ns-new{display:flex;align-items:center;justify-content:center;gap:7px;width:100%;flex-shrink:0;
|
|
124
|
+
font-family:var(--font);font-size:13px;font-weight:600;color:var(--accent);
|
|
125
|
+
background:var(--accent-soft);border:0;border-radius:var(--r-sm);padding:10px 12px;
|
|
126
|
+
cursor:pointer;transition:background .16s,transform .1s}
|
|
127
|
+
.ns-new .ns-plus{font-size:15px;line-height:1;font-weight:400}
|
|
128
|
+
.ns-new:hover{background:rgba(10,132,255,.18)}
|
|
129
|
+
.ns-new:active{transform:scale(.985)}
|
|
130
|
+
.ns-head{display:flex;align-items:center;justify-content:space-between;flex-shrink:0;
|
|
131
|
+
font-size:10.5px;font-weight:700;letter-spacing:.09em;color:var(--faint);
|
|
132
|
+
text-transform:uppercase;padding:4px 2px 0;user-select:none}
|
|
133
|
+
.ns-head em{font-style:normal;letter-spacing:.06em}
|
|
134
|
+
.ns-list{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column;gap:3px}
|
|
135
|
+
.ns-item{padding:9px 12px;border-radius:var(--r-sm);cursor:pointer;
|
|
136
|
+
transition:background .16s,color .16s;position:relative}
|
|
137
|
+
.ns-item:hover{background:var(--surface-2)}
|
|
138
|
+
.ns-item.on{background:var(--surface);
|
|
139
|
+
box-shadow:0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(10,132,255,.28)}
|
|
140
|
+
.ns-item b{display:block;font-size:13px;font-weight:600;line-height:1.35;
|
|
141
|
+
white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:18px}
|
|
142
|
+
.ns-item span{display:block;font-size:10.5px;color:var(--faint);line-height:1.5;
|
|
143
|
+
white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:16px}
|
|
144
|
+
.ns-item .ns-del{position:absolute;right:8px;top:8px;color:var(--faint);font-size:13px;
|
|
145
|
+
opacity:0;transition:opacity .14s;padding:0 2px;line-height:1}
|
|
146
|
+
.ns-item:hover .ns-del{opacity:1}
|
|
147
|
+
.ns-item .ns-del:hover{color:var(--red)}
|
|
148
|
+
|
|
149
|
+
/* 左栏底部:功能菜单按钮(把原来平铺的八项收进一个分类菜单) */
|
|
150
|
+
.nav-menu-btn{display:flex;align-items:center;gap:9px;width:100%;flex-shrink:0;
|
|
151
|
+
font-family:var(--font);font-size:13px;font-weight:600;color:var(--dim);
|
|
152
|
+
background:var(--surface-2);border:0;border-radius:var(--r-sm);padding:10px 12px;
|
|
153
|
+
cursor:pointer;transition:background .16s,color .16s,transform .1s}
|
|
154
|
+
.nav-menu-btn:hover{background:var(--surface);color:var(--ink)}
|
|
155
|
+
.nav-menu-btn:active{transform:scale(.985)}
|
|
156
|
+
.nav-menu-btn.open{background:var(--surface);color:var(--ink);box-shadow:0 1px 3px rgba(0,0,0,.08)}
|
|
157
|
+
.nav-menu-btn.open .nm-ic{color:var(--accent)}
|
|
158
|
+
.nav-menu-btn .nm-ic{width:17px;height:17px;flex-shrink:0;display:grid;place-items:center;color:currentColor}
|
|
159
|
+
.nav-menu-btn .nm-ic svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:1.9;
|
|
160
|
+
stroke-linecap:round;stroke-linejoin:round}
|
|
161
|
+
.nav-menu-btn b{flex:1;text-align:left;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
162
|
+
.nav-menu-btn .nm-caret{font-size:10px;color:var(--faint);transition:transform .18s}
|
|
163
|
+
.nav-menu-btn.open .nm-caret{transform:rotate(180deg)}
|
|
164
|
+
|
|
165
|
+
/* 功能菜单浮层(分类菜单:工作台 / 能力 / 知识) */
|
|
166
|
+
.nav-menu{position:fixed;z-index:var(--z-menu);display:none;width:248px;max-height:72vh;overflow:auto;
|
|
167
|
+
padding:8px;border-radius:18px;background:var(--glass-strong);
|
|
168
|
+
backdrop-filter:blur(22px) saturate(180%);-webkit-backdrop-filter:blur(22px) saturate(180%);
|
|
169
|
+
border:1px solid var(--line-soft);box-shadow:var(--sh-pop)}
|
|
170
|
+
.nav-menu.show{display:block;animation:rise .18s ease-out}
|
|
171
|
+
.nav-menu-head{display:flex;align-items:center;justify-content:space-between;
|
|
172
|
+
padding:6px 10px 8px;font-size:10.5px;font-weight:700;letter-spacing:.09em;
|
|
173
|
+
color:var(--faint);text-transform:uppercase;user-select:none}
|
|
174
|
+
.nav-menu-head .x{color:var(--faint);cursor:pointer;font-size:13px;line-height:1}
|
|
175
|
+
.nav-menu-head .x:hover{color:var(--ink)}
|
|
176
|
+
.nav-menu .nav-list{flex:none;overflow:visible}
|
|
177
|
+
.nav-menu .nav-sec{padding:11px 10px 3px}
|
|
178
|
+
.nav-menu .nav-link{min-height:38px;padding:8px 10px;font-size:13px}
|
|
179
|
+
.nav-menu .nav-link.on{background:var(--accent-soft);box-shadow:none}
|
|
180
|
+
|
|
181
|
+
.feed-box{flex:1;min-height:0;display:flex;flex-direction:column;gap:8px}
|
|
182
|
+
.feed-head{flex-shrink:0;display:flex;align-items:center;justify-content:space-between;padding:0 2px}
|
|
183
|
+
.feed-head .fh-t{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:700;letter-spacing:-.01em}
|
|
184
|
+
.feed-head .fh-t .ic{font-size:13px;color:var(--accent)}
|
|
185
|
+
.feed-head .fh-more{font-size:11px;color:var(--faint);cursor:pointer}
|
|
186
|
+
.feed-head .fh-more:hover{color:var(--accent)}
|
|
187
|
+
.feed-scroll{flex:1;min-height:0;overflow:hidden;position:relative;
|
|
188
|
+
-webkit-mask-image:linear-gradient(180deg,transparent,#000 6%,#000 94%,transparent);
|
|
189
|
+
mask-image:linear-gradient(180deg,transparent,#000 6%,#000 94%,transparent)}
|
|
190
|
+
.feed-track{display:flex;flex-direction:column;gap:8px;padding:2px 0}
|
|
191
|
+
.feed-track.rolling{animation:feedRoll linear infinite}
|
|
192
|
+
@keyframes feedRoll{from{transform:translateY(0)}to{transform:translateY(-50%)}}
|
|
193
|
+
.feed-scroll:hover .feed-track.rolling{animation-play-state:paused}
|
|
194
|
+
.feed-item{flex-shrink:0;padding:13px 14px;border-radius:var(--r-mid);cursor:pointer;transition:.16s;
|
|
195
|
+
background:var(--surface);border:1px solid var(--line-soft);box-shadow:0 1px 2px rgba(0,0,0,.04)}
|
|
196
|
+
.feed-item:hover{border-color:var(--line);box-shadow:var(--sh-card);transform:translateY(-1px)}
|
|
197
|
+
.feed-item b{display:block;font-size:14px;font-weight:600;line-height:1.35;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
198
|
+
.feed-item span{font-size:12px;color:var(--dim)}
|
|
199
|
+
.feed-loading,.feed-empty{padding:24px;text-align:center;color:var(--faint);font-size:12px}
|
|
200
|
+
|
|
201
|
+
/* ═══ 中央:主内容卡 + 底部输入 ═══ */
|
|
202
|
+
.corewrap{position:relative;display:grid;place-items:center;overflow:hidden;border-radius:var(--r-card);
|
|
203
|
+
background:var(--panel);border:1px solid var(--line-soft);box-shadow:var(--sh-card)}
|
|
204
|
+
#coreCanvas{display:none} /* 深色科幻球隐藏,中央走内容 */
|
|
205
|
+
.core-label{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none;z-index:2;padding:20px 40px}
|
|
206
|
+
.core-label .t1{font-size:clamp(26px,3vw,40px);font-weight:800;letter-spacing:-.03em;line-height:1.05;color:var(--ink)}
|
|
207
|
+
.core-label .t2{font-size:13px;letter-spacing:.14em;text-transform:uppercase;color:var(--dim);margin-top:8px;font-weight:600}
|
|
208
|
+
|
|
209
|
+
.core-stage,.core-chat{position:absolute;inset:0;z-index:3;display:none;flex-direction:column;
|
|
210
|
+
background:rgba(230,226,219,.96); /* L1 页面底(=首页 body),二级页是"插进"的独立页面,底色同首页 */
|
|
211
|
+
backdrop-filter:blur(24px) saturate(180%);-webkit-backdrop-filter:blur(24px) saturate(180%);
|
|
212
|
+
border-radius:var(--r-card);overflow:hidden}
|
|
213
|
+
.core-stage.show,.core-chat.show{display:flex}
|
|
214
|
+
.core-chat{z-index:5}
|
|
215
|
+
.cs-head,.cc-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--line);flex-shrink:0}
|
|
216
|
+
.cs-head .t,.cc-head .t{display:flex;align-items:center;gap:9px;font-size:15px;font-weight:700;letter-spacing:-.01em;color:var(--ink)}
|
|
217
|
+
.cs-head .t .dot,.cc-head .t .dot{width:8px;height:8px;border-radius:50%;background:var(--accent)}
|
|
218
|
+
.cs-head .t em,.cc-head .t em{font-style:normal;font-size:11px;color:var(--faint);letter-spacing:.1em;text-transform:uppercase}
|
|
219
|
+
.cs-head .x,.cc-head .x{color:var(--dim);cursor:pointer;font-size:16px;transition:.15s}
|
|
220
|
+
.cs-head .x:hover,.cc-head .x:hover{color:var(--ink)}
|
|
221
|
+
.cs-body,.cc-body{flex:1;overflow:auto;padding:20px 22px}
|
|
222
|
+
.cc-q{font-size:14px;color:var(--dim);margin-bottom:16px;padding-bottom:14px;border-bottom:1px solid var(--line)}
|
|
223
|
+
.cc-q .cc-qimgs{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
|
|
224
|
+
.cc-q .cc-qimg{width:60px;height:60px;object-fit:cover;border-radius:10px;border:1px solid var(--line)}
|
|
225
|
+
#ccReply{font-size:14.5px;line-height:1.65;color:var(--ink);white-space:pre-wrap}
|
|
226
|
+
#ccReply.cc-md{white-space:normal} /* 渲染成 markdown 后取消 pre-wrap,避免块元素间多余空行 */
|
|
227
|
+
.cc-status{font-size:12px;color:var(--dim);margin-top:16px}
|
|
228
|
+
.cc-loading{color:var(--dim);font-size:14px}
|
|
229
|
+
/* 推理过程折叠块:默认收起,只在模型真的吐了思考时出现;正文区不受影响 */
|
|
230
|
+
.cc-think{margin:0 0 10px;font-size:12.5px;color:var(--dim);border-left:2px solid var(--line);padding-left:10px}
|
|
231
|
+
.cc-think summary{cursor:pointer;user-select:none;color:var(--dim);font-size:12px;letter-spacing:.02em}
|
|
232
|
+
.cc-think summary:hover{color:var(--ink)}
|
|
233
|
+
.cc-think .cc-think-body{margin-top:6px;white-space:pre-wrap;line-height:1.6;max-height:240px;overflow:auto;opacity:.82}
|
|
234
|
+
/* 执行计划:计划 stage 一完成就出现,默认展开(与推理不同——计划是用户要核对的东西) */
|
|
235
|
+
.cc-plan{margin:0 0 10px;font-size:12.5px;color:var(--dim);border-left:2px solid var(--line);padding-left:10px}
|
|
236
|
+
.cc-plan summary{cursor:pointer;user-select:none;color:var(--dim);font-size:12px;letter-spacing:.02em}
|
|
237
|
+
.cc-plan summary:hover{color:var(--ink)}
|
|
238
|
+
.cc-plan .cc-plan-body{margin:6px 0 0;padding-left:18px;line-height:1.7;opacity:.9}
|
|
239
|
+
.cc-plan .cc-plan-body li{margin:2px 0}
|
|
240
|
+
/* 执行凭据:答案下方的核对区。三态用颜色区分,但"未核验"绝不画成成功色 ——
|
|
241
|
+
这里的意义就是不把没有凭据的步骤伪装成做完了。 */
|
|
242
|
+
.cc-ev{margin:8px 0 0;padding:8px 10px;border:1px solid var(--line);border-radius:10px;background:var(--surface);font-size:12px}
|
|
243
|
+
.cc-ev .ev-head{color:var(--dim);letter-spacing:.02em;margin-bottom:6px;display:flex;gap:6px;align-items:center}
|
|
244
|
+
.cc-ev .ev-count{color:var(--faint);font-size:11px}
|
|
245
|
+
.cc-ev .ev-row{display:flex;flex-wrap:wrap;gap:6px;align-items:center;padding:3px 0;border-top:1px dashed var(--line)}
|
|
246
|
+
.cc-ev .ev-row:first-of-type{border-top:none}
|
|
247
|
+
.ev-chip{font-size:11px;padding:1px 6px;border-radius:999px;white-space:nowrap;border:1px solid transparent}
|
|
248
|
+
.ev-chip.ev-ok{color:#0a7d3f;background:rgba(10,125,63,.10);border-color:rgba(10,125,63,.25)}
|
|
249
|
+
.ev-chip.ev-warn{color:#8a6100;background:rgba(196,138,0,.12);border-color:rgba(196,138,0,.28)}
|
|
250
|
+
.ev-chip.ev-bad{color:#b3261e;background:rgba(179,38,30,.10);border-color:rgba(179,38,30,.25)}
|
|
251
|
+
.ev-tool{color:var(--dim);font-family:var(--mono,ui-monospace,monospace);font-size:11px}
|
|
252
|
+
.ev-why{color:var(--faint);font-size:11px}
|
|
253
|
+
.ev-item{color:var(--accent);text-decoration:none;border-bottom:1px solid var(--accent-soft);font-size:11px;max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
254
|
+
.ev-item:hover{border-bottom-color:var(--accent)}
|
|
255
|
+
/* 对话线程:双方对称气泡(助手左/用户右),各自独立圆角框;cc-body 可滚动=下拉浏览历史 */
|
|
256
|
+
.chat-row{display:flex;gap:10px;margin:16px 0;align-items:flex-start}
|
|
257
|
+
.chat-row:first-child{margin-top:2px}
|
|
258
|
+
.chat-row.ai{justify-content:flex-start}
|
|
259
|
+
.chat-row.me{justify-content:flex-end}
|
|
260
|
+
.chat-av{width:30px;height:30px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;color:#fff;user-select:none}
|
|
261
|
+
.chat-av.ai{background:linear-gradient(150deg,var(--accent),var(--accent-deep))}
|
|
262
|
+
.chat-av.me{background:linear-gradient(150deg,#b8b5af,#8b887f);font-size:11px}
|
|
263
|
+
.chat-col{max-width:78%;min-width:0;display:flex;flex-direction:column;gap:5px}
|
|
264
|
+
.chat-row.me .chat-col{align-items:flex-end}
|
|
265
|
+
.chat-meta{display:flex;gap:8px;align-items:baseline;font-size:11px;color:var(--faint);padding:0 3px}
|
|
266
|
+
.chat-name{font-weight:600;color:var(--dim)}
|
|
267
|
+
.chat-bubble{padding:9px 13px;border-radius:15px;font-size:14.5px;line-height:1.65;color:var(--ink);overflow-wrap:anywhere}
|
|
268
|
+
.chat-bubble.ai{background:var(--surface);border:1px solid var(--line);border-top-left-radius:5px;box-shadow:var(--sh-card)}
|
|
269
|
+
.chat-bubble.me{background:var(--accent-soft);border:1px solid rgba(10,132,255,.18);border-top-right-radius:5px;white-space:pre-wrap}
|
|
270
|
+
|
|
271
|
+
/* 回复 markdown */
|
|
272
|
+
.cc-md{white-space:normal}
|
|
273
|
+
.cc-md .cc-p{margin:.5em 0}
|
|
274
|
+
.cc-md .cc-h{margin:.7em 0 .35em;font-weight:700;line-height:1.3;letter-spacing:-.01em}
|
|
275
|
+
.cc-md h1.cc-h{font-size:1.4em}.cc-md h2.cc-h{font-size:1.2em}.cc-md h3.cc-h{font-size:1.08em}
|
|
276
|
+
.cc-md .cc-ul,.cc-md .cc-ol{margin:.4em 0;padding-left:1.4em}.cc-md li{margin:.25em 0}
|
|
277
|
+
.cc-md a{color:var(--accent);text-decoration:none;border-bottom:1px solid var(--accent-soft)}
|
|
278
|
+
.cc-md a:hover{border-bottom-color:var(--accent)}
|
|
279
|
+
.cc-md .cc-bq{margin:.6em 0;padding:.5em .9em;border-left:3px solid var(--accent);background:var(--accent-soft);border-radius:0 10px 10px 0}
|
|
280
|
+
.cc-md .cc-ic{background:var(--surface-2);color:#b3306b;padding:2px 6px;border-radius:6px;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:.9em}
|
|
281
|
+
.cc-md .cc-code{margin:.6em 0;padding:12px 14px;background:var(--surface-2);border:1px solid var(--line-soft);border-radius:12px;overflow-x:auto}
|
|
282
|
+
.cc-md .cc-code code{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:13px;white-space:pre;color:var(--ink)}
|
|
283
|
+
.cc-md .cc-hr{border:0;border-top:1px solid var(--line);margin:.8em 0}
|
|
284
|
+
.cc-md .cc-img,.cc-md .cc-media{max-width:100%;border-radius:12px;margin:.5em 0;display:block}
|
|
285
|
+
|
|
286
|
+
/* ═══ 底部输入:apple 大 pill ═══ */
|
|
287
|
+
.bottomband{overflow:visible}
|
|
288
|
+
.cmdwrap{position:relative;display:flex;flex-direction:column;gap:10px}
|
|
289
|
+
.cmdbar{display:flex;align-items:center;padding:7px;border-radius:var(--r-pill);
|
|
290
|
+
background:var(--surface);border:1px solid var(--line);box-shadow:0 2px 8px rgba(0,0,0,.05),0 16px 36px rgba(0,0,0,.09)}
|
|
291
|
+
.cmdbar-inner{flex:1;display:flex;align-items:center;gap:10px;padding:6px 8px}
|
|
292
|
+
.cmdbar input{flex:1;background:transparent;border:0;outline:0;color:var(--ink);font-size:16px;font-family:var(--font)}
|
|
293
|
+
.cmdbar input::placeholder{color:var(--faint)}
|
|
294
|
+
.cmdbar .mic,.cmdbar .send{width:42px;height:42px;border-radius:50%;cursor:pointer;display:grid;place-items:center;font-size:17px;flex-shrink:0;transition:transform .12s,background .16s}
|
|
295
|
+
.cmdbar .mic{background:var(--surface-2);color:var(--dim)}
|
|
296
|
+
.cmdbar .mic:hover{background:var(--surface-3);color:var(--ink)}
|
|
297
|
+
.cmdbar .mic#cmdMore{color:var(--ink);font-weight:700}
|
|
298
|
+
.cmdbar .send{background:var(--accent);color:#fff;box-shadow:var(--sh-accent)}
|
|
299
|
+
.cmdbar .send:hover{background:var(--accent-deep)}
|
|
300
|
+
.cmdbar .mic:active,.cmdbar .send:active{transform:scale(.94)}
|
|
301
|
+
#cmdTools{display:none}
|
|
302
|
+
|
|
303
|
+
/* 输入上方弹层(斜杠 / 工具 / 连接器 / @)—— 白玻璃从底部升起 */
|
|
304
|
+
.slash-menu,.tool-menu,.conn-panel{display:none;position:absolute;bottom:calc(100% + 10px);z-index:60;
|
|
305
|
+
background:var(--glass-strong);backdrop-filter:blur(24px) saturate(180%);-webkit-backdrop-filter:blur(24px) saturate(180%);
|
|
306
|
+
border:1px solid var(--line);border-top:1px solid rgba(255,255,255,.8);border-radius:18px;box-shadow:var(--sh-pop)}
|
|
307
|
+
.slash-menu{left:0;right:0;padding:6px;max-height:340px;overflow-y:auto}
|
|
308
|
+
.conn-panel{left:0;right:0;padding:8px;max-height:400px;overflow-y:auto}
|
|
309
|
+
.tool-menu{left:0;width:200px;padding:5px}
|
|
310
|
+
.slash-menu.show,.tool-menu.show,.conn-panel.show{display:block;animation:rise .24s cubic-bezier(.2,.8,.2,1) both;transform-origin:bottom left}
|
|
311
|
+
@keyframes rise{from{opacity:0;transform:translateY(8px) scale(.98);filter:blur(6px)}to{opacity:1;transform:none;filter:blur(0)}}
|
|
312
|
+
.slash-hint{padding:6px 12px 9px;font-size:11px;color:var(--faint);border-bottom:1px solid var(--line-soft);margin-bottom:4px}
|
|
313
|
+
.slash-item,.tool-item{display:flex;align-items:center;gap:11px;padding:10px 12px;border-radius:12px;cursor:pointer;transition:background .14s}
|
|
314
|
+
.slash-item:hover,.slash-item.sel,.tool-item:hover{background:var(--surface-2)}
|
|
315
|
+
.slash-item .si-ic{font-size:16px;width:22px;text-align:center;flex-shrink:0}
|
|
316
|
+
.slash-item .si-cmd{font-weight:600;font-size:13.5px}
|
|
317
|
+
.slash-item .si-desc{color:var(--dim);font-size:12px;margin-left:auto;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
318
|
+
.slash-item.danger .si-cmd{color:var(--red)}
|
|
319
|
+
.tool-item .ti-ic{font-size:14px;width:18px;text-align:center;flex-shrink:0}
|
|
320
|
+
.tool-item .ti-tx b{display:block;font-size:12.5px;font-weight:600;line-height:1.25}
|
|
321
|
+
.tool-item .ti-tx span{display:block;font-size:10px;color:var(--dim)}
|
|
322
|
+
|
|
323
|
+
/* 图片附件条 */
|
|
324
|
+
.img-strip{display:none;gap:8px;align-items:center;flex-wrap:wrap;padding:2px}
|
|
325
|
+
.img-strip.show{display:flex}
|
|
326
|
+
.img-thumb{position:relative;width:54px;height:54px;border-radius:11px;overflow:hidden;border:1px solid var(--line);flex-shrink:0}
|
|
327
|
+
.img-thumb img{width:100%;height:100%;object-fit:cover}
|
|
328
|
+
.img-thumb .it-x{position:absolute;top:2px;right:2px;width:16px;height:16px;border-radius:50%;background:rgba(0,0,0,.55);color:#fff;font-size:10px;line-height:16px;text-align:center;cursor:pointer}
|
|
329
|
+
.img-note{font-size:12px;color:var(--dim);flex:1;min-width:140px}
|
|
330
|
+
|
|
331
|
+
/* 文件附件条(聊天附件,区别于图片多模态) */
|
|
332
|
+
.file-strip{display:none;gap:8px;align-items:center;flex-wrap:wrap;padding:2px}
|
|
333
|
+
.file-strip.show{display:flex}
|
|
334
|
+
.file-card{position:relative;display:flex;align-items:center;gap:6px;padding:5px 8px;border-radius:9px;border:1px solid var(--line);font-size:12px;color:var(--ink);max-width:220px}
|
|
335
|
+
.file-card .fc-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:150px}
|
|
336
|
+
.file-card .fc-x{width:16px;height:16px;border-radius:50%;background:rgba(0,0,0,.55);color:#fff;font-size:10px;line-height:16px;text-align:center;cursor:pointer;flex-shrink:0}
|
|
337
|
+
|
|
338
|
+
/* 气泡内文件附件卡片(可下载) */
|
|
339
|
+
.cc-files{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
|
|
340
|
+
.cc-file{display:inline-flex;align-items:center;gap:6px;margin:2px 0;padding:6px 10px;border-radius:9px;border:1px solid var(--line);background:rgba(0,217,255,.05);font-size:12.5px;color:var(--cyan);text-decoration:none;max-width:100%}
|
|
341
|
+
.cc-file .cc-file-size{font-size:11px;color:var(--dim)}
|
|
342
|
+
|
|
343
|
+
/* 连接器面板 */
|
|
344
|
+
.conn-sec{margin:2px 2px 10px}
|
|
345
|
+
.conn-sec-h{font-size:10px;color:var(--faint);letter-spacing:.06em;padding:6px 8px;display:flex;justify-content:space-between;text-transform:uppercase;font-weight:600}
|
|
346
|
+
.conn-row{display:flex;align-items:center;gap:10px;padding:10px;border-radius:12px;transition:background .14s}
|
|
347
|
+
.conn-row:hover{background:var(--surface-2)}
|
|
348
|
+
.conn-row .cr-ic{font-size:16px;width:20px;text-align:center;flex-shrink:0}
|
|
349
|
+
.conn-row .cr-name{font-size:13px;font-weight:600}
|
|
350
|
+
.conn-row .cr-meta{font-size:11px;color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:230px}
|
|
351
|
+
.conn-row .cr-right{margin-left:auto;display:flex;align-items:center;gap:8px;flex-shrink:0}
|
|
352
|
+
.conn-badge{font-size:9.5px;padding:2px 7px;border-radius:7px;font-weight:600;white-space:nowrap}
|
|
353
|
+
.conn-badge.high{background:rgba(26,157,95,.14);color:var(--green)}
|
|
354
|
+
.conn-badge.mid{background:rgba(199,116,0,.14);color:var(--amber)}
|
|
355
|
+
.conn-badge.low{background:rgba(229,72,77,.14);color:var(--red)}
|
|
356
|
+
.conn-foot{display:flex;gap:8px;padding:8px 4px 2px;border-top:1px solid var(--line-soft)}
|
|
357
|
+
.conn-foot button{flex:1;padding:9px;border-radius:10px;border:0;background:var(--accent-soft);color:var(--accent);font-size:12.5px;font-weight:600;cursor:pointer}
|
|
358
|
+
.conn-foot button:hover{background:rgba(10,132,255,.18)}
|
|
359
|
+
.conn-empty{padding:18px;text-align:center;color:var(--dim);font-size:12px}
|
|
360
|
+
.conn-sw,.sw{position:relative;flex-shrink:0;cursor:pointer}
|
|
361
|
+
.conn-sw{width:36px;height:20px}.sw{width:44px;height:24px}
|
|
362
|
+
.conn-sw input,.sw input{opacity:0;width:0;height:0;position:absolute}
|
|
363
|
+
.conn-sw i,.sw i{position:absolute;inset:0;border-radius:99px;background:var(--surface-3);transition:.2s}
|
|
364
|
+
.conn-sw i:before,.sw i:before{content:'';position:absolute;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.2);transition:.2s;top:2px;left:2px}
|
|
365
|
+
.conn-sw i:before{width:16px;height:16px}.sw i:before{width:18px;height:18px;top:3px;left:3px}
|
|
366
|
+
.conn-sw input:checked+i,.sw input:checked+i{background:var(--accent)}
|
|
367
|
+
.conn-sw input:checked+i:before{transform:translateX(16px)}.sw input:checked+i:before{transform:translateX(20px)}
|
|
368
|
+
|
|
369
|
+
/* 模型菜单 */
|
|
370
|
+
.model-menu{position:absolute;top:46px;right:0;width:238px;z-index:var(--z-menu);display:none;padding:7px;
|
|
371
|
+
background:var(--glass-strong);backdrop-filter:blur(24px) saturate(180%);-webkit-backdrop-filter:blur(24px) saturate(180%);
|
|
372
|
+
border:1px solid var(--line);border-top:1px solid rgba(255,255,255,.8);border-radius:16px;box-shadow:var(--sh-pop)}
|
|
373
|
+
.model-menu.show{display:block;animation:popTR .22s cubic-bezier(.2,.8,.2,1) both;transform-origin:top right}
|
|
374
|
+
@keyframes popTR{from{opacity:0;transform:translateY(-6px) scale(.96);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}
|
|
375
|
+
.mtitle{font-size:9px;letter-spacing:.08em;color:var(--faint);padding:5px 9px;text-transform:uppercase;font-weight:600}
|
|
376
|
+
.model-opt{display:flex;align-items:center;gap:10px;padding:10px;border-radius:11px;cursor:pointer;transition:.14s;font-size:12px}
|
|
377
|
+
.model-opt:hover{background:var(--surface-2)}
|
|
378
|
+
.model-opt.disabled{opacity:.42;cursor:not-allowed}
|
|
379
|
+
.model-opt.active{background:var(--accent-soft)}
|
|
380
|
+
.model-opt .mdot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
|
|
381
|
+
.model-opt .mname{flex:1}
|
|
382
|
+
.model-opt .mname b{display:block;font-size:12.5px;font-weight:600}
|
|
383
|
+
.model-opt .mname span{font-size:9.5px;color:var(--faint)}
|
|
384
|
+
.model-opt .mtag{font-size:8px;padding:2px 6px;border-radius:6px;background:var(--accent-soft);color:var(--accent);font-weight:600}
|
|
385
|
+
|
|
386
|
+
/* ═══ 右栏:面板 + 任务 + 记忆 ═══ */
|
|
387
|
+
.panel{display:flex;flex-direction:column;border-radius:var(--r-mid);overflow:hidden}
|
|
388
|
+
.panel>.ph{display:flex;align-items:center;justify-content:space-between;padding:2px 2px 12px}
|
|
389
|
+
.panel>.ph .pt{display:flex;align-items:center;gap:9px;font-size:14px;font-weight:700;letter-spacing:-.01em}
|
|
390
|
+
.panel>.ph .pt .dot{width:8px;height:8px;border-radius:50%;background:var(--accent)}
|
|
391
|
+
.panel>.ph .pt em{font-style:normal;font-size:9px;color:var(--faint);letter-spacing:.1em;text-transform:uppercase;font-weight:600}
|
|
392
|
+
.panel>.ph .x{color:var(--faint);cursor:pointer;font-size:15px}
|
|
393
|
+
.panel>.ph .x:hover{color:var(--ink)}
|
|
394
|
+
.panel>.pb{overflow:auto;flex:1}
|
|
395
|
+
|
|
396
|
+
/* ═══ 右栏:记忆 + 知识 信息条 ═══ */
|
|
397
|
+
/* 会话历史搬到左栏后,记忆面板只剩四联统计 → 高度回到内容,剩余空间给知识库 */
|
|
398
|
+
#memPanel{flex:0 0 auto}
|
|
399
|
+
#knowPanel{flex:1 1 auto;min-height:0}
|
|
400
|
+
/* 记忆四联统计 */
|
|
401
|
+
.mem-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin-bottom:12px;flex-shrink:0}
|
|
402
|
+
.mem-stats .ms{background:var(--surface);border-radius:var(--r-sm);padding:9px 4px;text-align:center;
|
|
403
|
+
box-shadow:0 1px 2px rgba(0,0,0,.04)}
|
|
404
|
+
.mem-stats .ms b{display:block;font-size:16px;font-weight:700;letter-spacing:-.02em;
|
|
405
|
+
font-variant-numeric:tabular-nums;line-height:1.15}
|
|
406
|
+
.mem-stats .ms span{font-size:10px;color:var(--dim)}
|
|
407
|
+
/* 知识摄入入口(右栏知识库面板常驻) */
|
|
408
|
+
.ingest-row{display:flex;gap:5px;margin-bottom:10px;flex-shrink:0}
|
|
409
|
+
.ing-btn{flex:1;font-family:var(--font);font-size:11.5px;font-weight:600;color:var(--ink);
|
|
410
|
+
background:var(--surface);border:1px solid var(--line-soft);border-radius:var(--r-sm);
|
|
411
|
+
padding:8px 4px;cursor:pointer;white-space:nowrap;
|
|
412
|
+
transition:background .16s,border-color .16s,transform .1s}
|
|
413
|
+
.ing-btn:hover{background:#fff;border-color:var(--line);box-shadow:0 1px 3px rgba(0,0,0,.06)}
|
|
414
|
+
.ing-btn:active{transform:scale(.97)}
|
|
415
|
+
|
|
416
|
+
/* 信息条列表 */
|
|
417
|
+
.info-list{display:flex;flex-direction:column;gap:7px}
|
|
418
|
+
.info-item{position:relative;background:var(--surface);border:1px solid transparent;border-radius:var(--r-sm);
|
|
419
|
+
padding:10px 12px;cursor:pointer;transition:border-color .16s,box-shadow .16s,transform .1s}
|
|
420
|
+
.info-item.on{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent-soft)}
|
|
421
|
+
.info-item .it-del{position:absolute;right:8px;top:8px;color:var(--faint);font-size:12px;
|
|
422
|
+
opacity:0;transition:opacity .14s;padding:0 2px;line-height:1;cursor:pointer}
|
|
423
|
+
.info-item:hover .it-del{opacity:1}
|
|
424
|
+
.info-item .it-del:hover{color:var(--red)}
|
|
425
|
+
.info-item:hover{border-color:var(--line);box-shadow:var(--sh-card);transform:translateY(-1px)}
|
|
426
|
+
.info-item .it-h{display:flex;align-items:center;gap:7px;margin-bottom:3px}
|
|
427
|
+
.info-item .it-h b{flex:1;min-width:0;font-size:13px;font-weight:600;line-height:1.35;
|
|
428
|
+
white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
429
|
+
.info-item .it-tag{flex-shrink:0;font-size:9.5px;font-weight:600;padding:2px 6px;border-radius:6px;
|
|
430
|
+
background:var(--surface-2);color:var(--dim);letter-spacing:.02em}
|
|
431
|
+
.info-item .it-tag.shared{background:var(--accent-soft);color:var(--accent-deep)}
|
|
432
|
+
.info-item .it-sum{font-size:11.5px;color:var(--dim);line-height:1.45;
|
|
433
|
+
display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
|
|
434
|
+
.info-item .it-meta{font-size:10px;color:var(--faint);margin-top:4px}
|
|
435
|
+
.task{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--line-soft)}
|
|
436
|
+
.task:last-child{border:0}
|
|
437
|
+
.task .ti{width:34px;height:34px;border-radius:11px;display:grid;place-items:center;font-size:15px;background:var(--surface-2);color:var(--dim);flex-shrink:0}
|
|
438
|
+
.task .tb{flex:1;min-width:0}
|
|
439
|
+
.task .tb b{font-size:13.5px;font-weight:600;display:block}
|
|
440
|
+
.task .tb span{font-size:11px;color:var(--dim)}
|
|
441
|
+
.task .tt{font-size:11px;color:var(--faint);font-variant-numeric:tabular-nums}
|
|
442
|
+
.task.ok .ti{color:var(--green);background:rgba(26,157,95,.1)}
|
|
443
|
+
.memhead{display:flex;justify-content:space-between;gap:10px;margin-bottom:12px}
|
|
444
|
+
.memviz{height:130px;border-radius:14px;overflow:hidden;background:var(--surface-2);border:1px solid var(--line-soft);position:relative}
|
|
445
|
+
#memCanvas{width:100%;height:100%}
|
|
446
|
+
.memstat .k{font-size:11px;color:var(--dim)}
|
|
447
|
+
.memstat .v{font-size:22px;font-weight:700;letter-spacing:-.02em;font-variant-numeric:tabular-nums;margin-top:2px}
|
|
448
|
+
.btn-soft{margin-top:12px;width:100%;padding:11px;border-radius:12px;cursor:pointer;font-family:var(--font);
|
|
449
|
+
background:var(--accent-soft);border:0;color:var(--accent);font-size:13px;font-weight:600}
|
|
450
|
+
.btn-soft:hover{background:rgba(10,132,255,.18)}
|
|
451
|
+
|
|
452
|
+
/* ═══ 弹层:设置菜单 / 详情 / 录入 / 全屏 / 回复 ═══ */
|
|
453
|
+
/* 通用玻璃浮层材质 */
|
|
454
|
+
.setmenu{position:fixed;top:70px;right:16px;z-index:var(--z-overlay);display:none;flex-direction:row-reverse;align-items:flex-start;gap:8px;pointer-events:none}
|
|
455
|
+
.setmenu.show{display:flex}
|
|
456
|
+
.setmenu .sm-col{display:flex;flex-direction:column;gap:8px;pointer-events:auto}
|
|
457
|
+
.sm-l2:empty{display:none}
|
|
458
|
+
.sm-btn{display:flex;align-items:center;gap:9px;min-width:170px;padding:13px 6px;border-radius:14px;cursor:pointer;transition:all .16s ease;
|
|
459
|
+
background:var(--glass-strong);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);
|
|
460
|
+
border:1px solid var(--line);box-shadow:var(--sh-card)}
|
|
461
|
+
.sm-btn .gi{color:var(--accent);font-size:15px;padding-left:11px}
|
|
462
|
+
.sm-btn b{font-size:13.5px;font-weight:600;flex:1}
|
|
463
|
+
.sm-btn .chev{color:var(--faint);font-size:14px;padding-right:11px}
|
|
464
|
+
.sm-btn:hover{transform:translateY(-1px);box-shadow:var(--sh-pop)}
|
|
465
|
+
.sm-btn.active{border-color:rgba(10,132,255,.35);box-shadow:0 0 0 3px var(--accent-soft),var(--sh-card)}
|
|
466
|
+
.sm-l2 .sm-btn b{font-size:12.5px;padding-left:13px}
|
|
467
|
+
|
|
468
|
+
.sd-pop{position:fixed;top:70px;right:16px;width:400px;max-width:90vw;max-height:78vh;z-index:var(--z-top);display:none;flex-direction:column;
|
|
469
|
+
background:var(--glass-strong);backdrop-filter:blur(28px) saturate(180%);-webkit-backdrop-filter:blur(28px) saturate(180%);
|
|
470
|
+
border:1px solid var(--line);border-radius:20px;overflow:hidden;box-shadow:var(--sh-pop)}
|
|
471
|
+
.sd-pop.show{display:flex;animation:popTR .24s cubic-bezier(.2,.8,.2,1) both;transform-origin:top right}
|
|
472
|
+
.sd-pop-head{display:flex;align-items:center;justify-content:space-between;padding:16px 18px;border-bottom:1px solid var(--line)}
|
|
473
|
+
.sd-pop-head b{font-size:15px;font-weight:700;letter-spacing:-.01em}
|
|
474
|
+
.sd-pop-head .x{color:var(--dim);cursor:pointer;font-size:15px}
|
|
475
|
+
.sd-pop-head .x:hover{color:var(--ink)}
|
|
476
|
+
.sd-body{flex:1;overflow:auto;padding:18px;font-size:13.5px;line-height:1.7}
|
|
477
|
+
.sd-ph{color:var(--dim);text-align:center;padding:40px 0}
|
|
478
|
+
.sd-card{background:var(--surface);border:1px solid var(--line-soft);border-radius:14px;padding:16px;margin-bottom:14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}
|
|
479
|
+
.sd-big{font-size:22px;font-weight:700;letter-spacing:-.02em}
|
|
480
|
+
.sd-big span{font-size:13px;color:var(--accent);margin-left:6px;font-weight:600}
|
|
481
|
+
.sd-desc{font-size:13px;color:var(--dim);margin-top:6px;line-height:1.6}
|
|
482
|
+
.sd-sec{font-size:11px;letter-spacing:.06em;color:var(--dim);text-transform:uppercase;margin:18px 0 9px;display:flex;align-items:center;gap:8px;font-weight:600}
|
|
483
|
+
.sd-sec .badge{font-size:9px;font-weight:600;padding:2px 7px;border-radius:6px;letter-spacing:.03em}
|
|
484
|
+
.sd-sec .badge.edit{background:rgba(26,157,95,.13);color:var(--green)}
|
|
485
|
+
.sd-sec .badge.ro{background:var(--surface-3);color:var(--faint)}
|
|
486
|
+
.sd-row{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border:1px solid var(--line);border-radius:12px;margin-bottom:8px;cursor:pointer;transition:.14s}
|
|
487
|
+
.sd-row:hover:not(.dis):not(.cur){background:var(--surface-2);border-color:rgba(0,0,0,.14)}
|
|
488
|
+
.sd-row.cur{background:var(--accent-soft);border-color:rgba(10,132,255,.3)}
|
|
489
|
+
.sd-row.dis{opacity:.45;cursor:not-allowed}
|
|
490
|
+
.sd-row small{display:block;font-size:10.5px;color:var(--faint);margin-top:2px}
|
|
491
|
+
.sd-row .tag{font-size:9px;padding:2px 7px;border-radius:6px;background:var(--accent-soft);color:var(--accent);font-weight:600}
|
|
492
|
+
.sd-row.dis .tag{background:rgba(199,116,0,.14);color:var(--amber)}
|
|
493
|
+
.sd-kv{display:flex;align-items:center;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--line-soft)}
|
|
494
|
+
.sd-kv span{color:var(--dim);font-size:12.5px}.sd-kv b{font-size:13px;font-weight:600}
|
|
495
|
+
.sd-ro .sd-kv b{color:var(--dim);font-weight:500}
|
|
496
|
+
.sd-ro .sd-kv span::before{content:"🔒";font-size:9px;margin-right:5px;opacity:.5}
|
|
497
|
+
.sd-kv2{display:flex;align-items:center;justify-content:space-between;padding:12px 0}
|
|
498
|
+
.sd-kv2 select{background:var(--surface-2);border:1px solid var(--line);color:var(--ink);border-radius:9px;padding:8px 11px;font-size:12.5px;font-family:var(--font)}
|
|
499
|
+
.sd-toggle{display:flex;align-items:center;justify-content:space-between;padding:14px 0;border-bottom:1px solid var(--line-soft);font-size:13.5px}
|
|
500
|
+
.sd-note{font-size:12px;color:var(--dim);line-height:1.7;margin-top:16px;padding:13px;background:var(--surface-2);border-radius:12px}
|
|
501
|
+
.sd-note code{background:var(--accent-soft);color:var(--accent);padding:2px 6px;border-radius:5px;font-size:11.5px}
|
|
502
|
+
|
|
503
|
+
/* API Key 配置(设置 → 访问密钥) */
|
|
504
|
+
.api-key-row{margin:12px 0}
|
|
505
|
+
.api-key-inp{width:100%;box-sizing:border-box;padding:11px 13px;border-radius:11px;
|
|
506
|
+
background:var(--surface-2);border:1px solid var(--line);color:var(--ink);
|
|
507
|
+
font-size:13px;font-family:var(--font);outline:none;transition:.15s}
|
|
508
|
+
.api-key-inp:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
|
|
509
|
+
.api-key-btns{display:flex;gap:8px;margin:2px 0 0}
|
|
510
|
+
.api-key-btn{border:1px solid var(--line);background:var(--surface-2);color:var(--ink);
|
|
511
|
+
font-size:12.5px;padding:8px 16px;border-radius:10px;cursor:pointer;font-weight:600;transition:.15s}
|
|
512
|
+
.api-key-btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}
|
|
513
|
+
.api-key-btn:hover{filter:brightness(1.05)}
|
|
514
|
+
|
|
515
|
+
/* 鉴权提示条(401 时顶部弹出) */
|
|
516
|
+
#authHint{position:fixed;top:70px;left:50%;transform:translateX(-50%);z-index:9999;
|
|
517
|
+
display:flex;align-items:center;gap:12px;max-width:92vw;padding:11px 16px;border-radius:14px;
|
|
518
|
+
background:rgba(199,116,0,.16);border:1px solid var(--amber);color:var(--ink);
|
|
519
|
+
font-size:13px;box-shadow:var(--sh-pop);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}
|
|
520
|
+
#authHint .ah-ico{font-size:15px;color:var(--amber)}
|
|
521
|
+
#authHint .ah-txt{flex:1 1 auto;min-width:0}
|
|
522
|
+
#authHint .ah-btn{border:0;background:var(--amber);color:#fff;font-weight:700;font-size:12px;
|
|
523
|
+
padding:7px 15px;border-radius:9px;cursor:pointer;white-space:nowrap}
|
|
524
|
+
#authHint .ah-btn:hover{filter:brightness(1.08)}
|
|
525
|
+
#authHint .ah-x{border:0;background:none;color:var(--dim);cursor:pointer;font-size:14px;padding:2px 6px;line-height:1}
|
|
526
|
+
#authHint .ah-x:hover{color:var(--ink)}
|
|
527
|
+
|
|
528
|
+
/* 录入弹窗 */
|
|
529
|
+
.entry-mask,.ov-mask{position:fixed;inset:0;z-index:var(--z-overlay);display:none}
|
|
530
|
+
.entry-mask{background:rgba(0,0,0,.28);backdrop-filter:blur(4px);place-items:center}
|
|
531
|
+
.entry-mask.show{display:grid;animation:fade .2s ease both}
|
|
532
|
+
@keyframes fade{from{opacity:0}to{opacity:1}}
|
|
533
|
+
.entry-box{width:440px;max-width:92vw;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--sh-pop);padding:24px}
|
|
534
|
+
.entry-mask.show .entry-box{animation:dialogIn .26s cubic-bezier(.2,.8,.2,1) both}
|
|
535
|
+
@keyframes dialogIn{from{opacity:0;transform:scale(.96) translateY(6px);filter:blur(6px)}to{opacity:1;transform:none;filter:blur(0)}}
|
|
536
|
+
.entry-box h3{font-size:19px;font-weight:700;letter-spacing:-.02em;margin-bottom:4px}
|
|
537
|
+
.entry-box .sub{font-size:12.5px;color:var(--dim);margin-bottom:18px}
|
|
538
|
+
.entry-field{margin-bottom:12px}
|
|
539
|
+
.entry-field label{display:block;font-size:11.5px;color:var(--dim);margin-bottom:5px}
|
|
540
|
+
.entry-field input,.entry-field select{width:100%;padding:11px 13px;border-radius:11px;background:var(--surface-2);border:1px solid var(--line);color:var(--ink);font-size:13.5px;font-family:var(--font);outline:none;transition:.15s}
|
|
541
|
+
.entry-field input:focus,.entry-field select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);background:#fff}
|
|
542
|
+
.entry-row2{display:grid;grid-template-columns:1fr 1fr;gap:10px}
|
|
543
|
+
.entry-btns{display:flex;gap:10px;margin-top:20px}
|
|
544
|
+
.entry-btns button{flex:1;padding:12px;border-radius:12px;cursor:pointer;font-size:13.5px;font-weight:600;font-family:var(--font);border:0;transition:transform .12s,background .15s}
|
|
545
|
+
.entry-btns button:active{transform:scale(.97)}
|
|
546
|
+
.entry-btns .ok{background:var(--accent);color:#fff}
|
|
547
|
+
.entry-btns .ok:hover{background:var(--accent-deep)}
|
|
548
|
+
.entry-btns .cancel{background:var(--surface-2);color:var(--ink)}
|
|
549
|
+
.entry-msg{font-size:11.5px;margin-top:10px;min-height:14px}
|
|
550
|
+
|
|
551
|
+
/* 全屏浮层 */
|
|
552
|
+
.ov-mask{background:rgba(0,0,0,.3);backdrop-filter:blur(6px);padding:3vh 3vw}
|
|
553
|
+
.ov-mask.show{display:block;animation:fade .2s ease both}
|
|
554
|
+
.ov-box{width:100%;height:100%;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--sh-pop);display:flex;flex-direction:column;overflow:hidden}
|
|
555
|
+
.ov-head{display:flex;align-items:center;justify-content:space-between;padding:18px 22px;border-bottom:1px solid var(--line)}
|
|
556
|
+
.ov-title{display:flex;align-items:center;gap:10px;font-size:17px;font-weight:700;letter-spacing:-.01em}
|
|
557
|
+
.ov-title .dot{width:9px;height:9px;border-radius:50%;background:var(--accent)}
|
|
558
|
+
.ov-title em{font-style:normal;font-size:11px;color:var(--dim);letter-spacing:.06em}
|
|
559
|
+
.ov-tools{display:flex;align-items:center;gap:18px}
|
|
560
|
+
.ov-auto{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--dim);cursor:pointer}
|
|
561
|
+
.ov-auto input{accent-color:var(--accent);width:15px;height:15px;cursor:pointer}
|
|
562
|
+
.ov-close{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;background:var(--surface-2);color:var(--dim);cursor:pointer;font-size:15px}
|
|
563
|
+
.ov-close:hover{background:var(--surface-3);color:var(--ink)}
|
|
564
|
+
.ov-body{flex:1;overflow:auto;padding:22px}
|
|
565
|
+
#ovBody #ovMap{width:100%;height:100%;min-height:60vh;border-radius:14px;overflow:hidden;border:1px solid var(--line)}
|
|
566
|
+
#ovBody canvas{width:100%;height:100%}
|
|
567
|
+
.ov-grid{display:grid;grid-template-columns:88px 1fr 88px;gap:14px;height:100%}
|
|
568
|
+
.ov-side{overflow:auto;text-align:left}
|
|
569
|
+
|
|
570
|
+
/* 地图搜索 */
|
|
571
|
+
.map-search{position:absolute;top:16px;left:16px;width:290px;z-index:var(--z-menu)}
|
|
572
|
+
.map-search input{width:100%;padding:12px 15px;border-radius:13px;font-size:13.5px;font-family:var(--font);color:var(--ink);font-weight:500;outline:none;
|
|
573
|
+
background:var(--glass-strong);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--line);box-shadow:var(--sh-card)}
|
|
574
|
+
.map-search input::placeholder{color:var(--faint);font-weight:400}
|
|
575
|
+
.map-search input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
|
|
576
|
+
.map-search-results{margin-top:8px;border-radius:14px;overflow:hidden;background:var(--glass-strong);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px)}
|
|
577
|
+
.map-search-results:not(:empty){border:1px solid var(--line);box-shadow:var(--sh-pop);max-height:340px;overflow-y:auto}
|
|
578
|
+
.msr-item{padding:11px 14px;cursor:pointer;border-bottom:1px solid var(--line-soft);transition:.14s}
|
|
579
|
+
.msr-item:last-child{border:0}
|
|
580
|
+
.msr-item:hover{background:var(--surface-2)}
|
|
581
|
+
.msr-item b{display:block;font-size:13px;font-weight:600}
|
|
582
|
+
.msr-item span{font-size:11px;color:var(--dim)}
|
|
583
|
+
.amap-maptypecontrol label,.amap-maptypecontrol span{color:var(--ink)!important}
|
|
584
|
+
.amap-maptypecontrol{border-radius:9px!important}
|
|
585
|
+
|
|
586
|
+
/* 回复浮窗 */
|
|
587
|
+
.reply-pop{position:fixed;left:50%;bottom:130px;transform:translateX(-50%);width:min(680px,86vw);max-height:46vh;z-index:250;display:none;
|
|
588
|
+
background:var(--glass-strong);backdrop-filter:blur(24px) saturate(180%);-webkit-backdrop-filter:blur(24px) saturate(180%);
|
|
589
|
+
border:1px solid var(--line);border-radius:18px;box-shadow:var(--sh-pop);overflow:hidden}
|
|
590
|
+
.reply-pop.show{display:flex;flex-direction:column}
|
|
591
|
+
.reply-pop .rp-head{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid var(--line);flex-shrink:0}
|
|
592
|
+
.reply-pop .rp-head .t{display:flex;align-items:center;gap:9px;font-size:14px;font-weight:700}
|
|
593
|
+
.reply-pop .rp-head .t .dot{width:8px;height:8px;border-radius:50%;background:var(--accent)}
|
|
594
|
+
.reply-pop .rp-head .x{color:var(--faint);cursor:pointer;font-size:16px}
|
|
595
|
+
.reply-pop .rp-body{padding:16px 18px;overflow:auto;font-size:14px;line-height:1.7}
|
|
596
|
+
.reply-pop .rp-q{font-size:12.5px;color:var(--dim);margin-bottom:10px}
|
|
597
|
+
.reply-pop .rp-status{font-size:11px;color:var(--dim);margin-top:10px}
|
|
598
|
+
|
|
599
|
+
/* 左栏 hover 飞出 */
|
|
600
|
+
.nav-flyout{position:fixed;z-index:var(--z-menu);display:none;min-width:230px;max-width:290px;border-radius:16px;padding:0;overflow:hidden;
|
|
601
|
+
background:var(--glass-strong);backdrop-filter:blur(24px) saturate(180%);-webkit-backdrop-filter:blur(24px) saturate(180%);
|
|
602
|
+
border:1px solid var(--line);box-shadow:var(--sh-pop)}
|
|
603
|
+
.nav-flyout.show{display:block;animation:rise .18s ease-out}
|
|
604
|
+
.nav-fly-head{display:flex;align-items:center;justify-content:space-between;padding:13px 15px;border-bottom:1px solid var(--line);font-size:13px;font-weight:700}
|
|
605
|
+
.nav-fly-head .more{font-size:11px;color:var(--accent);cursor:pointer}
|
|
606
|
+
.nav-fly-list{max-height:300px;overflow:auto;padding:6px}
|
|
607
|
+
.nav-fly-item{padding:10px 12px;border-radius:11px;cursor:pointer;display:flex;align-items:flex-start;gap:9px;font-size:13px;transition:.14s}
|
|
608
|
+
.nav-fly-item:hover{background:var(--surface-2)}
|
|
609
|
+
.nav-fly-item .fi-tx b{display:block;font-weight:600;font-size:12.5px}
|
|
610
|
+
.nav-fly-item .fi-tx span{font-size:10.5px;color:var(--dim)}
|
|
611
|
+
.nav-fly-empty{padding:22px;text-align:center;color:var(--faint);font-size:11px}
|
|
612
|
+
|
|
613
|
+
/* ═══ 内容组件:知识卡 / 财务 / 治理 / markdown 管理 ═══ */
|
|
614
|
+
/* 大屏模块卡 */
|
|
615
|
+
.big-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:14px}
|
|
616
|
+
.big-card,.big-li{background:var(--surface);border:1px solid var(--line-soft);border-radius:14px;padding:16px;box-shadow:0 1px 2px rgba(0,0,0,.04)}
|
|
617
|
+
.big-card .bc-head{font-size:12px;font-weight:700;color:var(--accent);margin-bottom:12px;padding-bottom:9px;border-bottom:1px solid var(--line-soft)}
|
|
618
|
+
.big-card .bc-row{display:flex;align-items:center;justify-content:space-between;padding:6px 0;font-size:13px}
|
|
619
|
+
.big-card .bc-row span{color:var(--dim)}
|
|
620
|
+
.big-list{display:flex;flex-direction:column;gap:8px}
|
|
621
|
+
.big-li{display:flex;align-items:center;justify-content:space-between;padding:13px 15px}
|
|
622
|
+
.big-li b{font-size:14px}.big-li span{font-size:12px;color:var(--dim)}
|
|
623
|
+
|
|
624
|
+
/* 办公知识卡 */
|
|
625
|
+
.know-list,.know-index{display:flex;flex-direction:column;gap:10px}
|
|
626
|
+
.know-card,.know-row{background:var(--surface);border:1px solid var(--line);border-radius:14px;box-shadow:var(--sh-card)}
|
|
627
|
+
.know-card{padding:16px 18px}
|
|
628
|
+
.know-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:9px}
|
|
629
|
+
.know-head b{font-size:15px;font-weight:700;letter-spacing:-.01em}
|
|
630
|
+
.know-tools{display:flex;align-items:center;gap:10px;flex-shrink:0}
|
|
631
|
+
.know-src{font-size:11px;color:var(--faint)}
|
|
632
|
+
.know-del{cursor:pointer;font-size:13px;opacity:.55;transition:.15s}
|
|
633
|
+
.know-del:hover{opacity:1;transform:scale(1.15)}
|
|
634
|
+
.know-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:13px 16px;cursor:pointer;transition:.15s}
|
|
635
|
+
.know-row:hover{border-color:var(--accent);box-shadow:0 2px 12px rgba(10,132,255,.12);transform:translateY(-1px)}
|
|
636
|
+
.know-row-tx{min-width:0;flex:1}
|
|
637
|
+
.know-row-tx b{font-size:14px;font-weight:600;display:block}
|
|
638
|
+
.know-row-tx span{font-size:12px;color:var(--dim);display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px}
|
|
639
|
+
.know-back{display:inline-block;cursor:pointer;color:var(--accent);font-size:13px;margin-bottom:14px;font-weight:500}
|
|
640
|
+
.know-back:hover{text-decoration:underline}
|
|
641
|
+
.know-body{font-size:14.5px;line-height:1.75;white-space:pre-wrap;word-break:break-word}
|
|
642
|
+
.know-notes{margin-top:18px;padding-top:16px;border-top:1px solid var(--line)}
|
|
643
|
+
.know-notes-h{font-size:13px;font-weight:700;color:var(--accent);margin-bottom:11px}
|
|
644
|
+
.know-note{display:flex;justify-content:space-between;gap:10px;background:var(--accent-soft);border-left:3px solid var(--accent);border-radius:0 8px 8px 0;padding:9px 11px;margin-bottom:8px}
|
|
645
|
+
.know-note span{font-size:13px;white-space:pre-wrap;word-break:break-word}
|
|
646
|
+
.know-note em{font-size:10px;color:var(--faint);font-style:normal;flex-shrink:0}
|
|
647
|
+
.know-note-empty{font-size:12px;color:var(--faint);margin-bottom:10px}
|
|
648
|
+
.know-note-add{display:flex;flex-direction:column;gap:8px}
|
|
649
|
+
.know-note-input{width:100%;resize:vertical;font-family:inherit;font-size:13px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;line-height:1.5;color:var(--ink);outline:none}
|
|
650
|
+
.know-note-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
|
|
651
|
+
.know-note-save{align-self:flex-end;padding:8px 18px;border-radius:10px;border:0;background:var(--accent);color:#fff;font-size:12.5px;font-weight:600;cursor:pointer}
|
|
652
|
+
.know-note-save:hover{background:var(--accent-deep)}
|
|
653
|
+
.know-note-save:disabled{opacity:.6;cursor:default}
|
|
654
|
+
.know-tags{margin-top:11px;display:flex;flex-wrap:wrap;gap:6px}
|
|
655
|
+
.know-tags span{font-size:11px;color:var(--accent);background:var(--accent-soft);border-radius:7px;padding:3px 9px}
|
|
656
|
+
|
|
657
|
+
/* 财务面板 kp-* */
|
|
658
|
+
.kp-sec{margin-bottom:15px}
|
|
659
|
+
.kp-sec .h{font-size:10px;letter-spacing:.06em;color:var(--dim);margin-bottom:8px;text-transform:uppercase;font-weight:600}
|
|
660
|
+
.kp-row{display:flex;align-items:center;gap:8px;font-size:12.5px;padding:5px 0}
|
|
661
|
+
.kp-add{display:inline-flex;align-items:center;gap:5px;font-size:12px;cursor:pointer;color:var(--accent);padding:4px 0;font-weight:500}
|
|
662
|
+
.kp-bud{margin:8px 0}
|
|
663
|
+
.kp-bud .top{display:flex;justify-content:space-between;font-size:12px;margin-bottom:4px}
|
|
664
|
+
.kp-bud .top b{font-weight:600}.kp-bud .top .over{color:var(--amber)}
|
|
665
|
+
.kp-bud .bar{height:7px;border-radius:4px;background:var(--surface-3);overflow:hidden}
|
|
666
|
+
.kp-bud .bar i{display:block;height:100%;border-radius:4px;background:var(--accent)}
|
|
667
|
+
.kp-chip{display:flex;align-items:flex-start;gap:8px;padding:10px 12px;border-radius:11px;margin:7px 0;font-size:12px;border:1px solid}
|
|
668
|
+
.kp-chip.info{background:var(--accent-soft);border-color:rgba(10,132,255,.2)}
|
|
669
|
+
/* 通用「i」信息图标 + hover 弹出气泡(可复用) */
|
|
670
|
+
.kp-tiprow{display:flex;align-items:center;gap:6px;margin:4px 2px 8px;font-size:11px;color:var(--dim)}
|
|
671
|
+
.infotip{position:relative;display:inline-flex;align-items:center;justify-content:center;width:15px;height:15px;border-radius:50%;background:var(--accent-soft);color:var(--accent);font:italic 700 10px/1 Georgia,serif;cursor:help;outline:none}
|
|
672
|
+
.infotip-pop{visibility:hidden;opacity:0;position:absolute;bottom:135%;left:50%;transform:translateX(-50%) translateY(4px);z-index:60;width:220px;padding:9px 11px;background:var(--surface);border:1px solid var(--line);border-radius:10px;box-shadow:var(--sh-pop);font:400 11px/1.55 inherit;font-style:normal;color:var(--dim);text-align:left;transition:opacity .14s,transform .14s;pointer-events:none}
|
|
673
|
+
.infotip:hover .infotip-pop,.infotip:focus .infotip-pop{visibility:visible;opacity:1;transform:translateX(-50%) translateY(0);pointer-events:auto}
|
|
674
|
+
.infotip-pop b{color:var(--ink,#1c1c1e);font-weight:600}
|
|
675
|
+
.infotip-link{display:inline-block;margin-top:5px;color:var(--accent);cursor:pointer}
|
|
676
|
+
.infotip-link:hover{text-decoration:underline}
|
|
677
|
+
.kp-chip.warn{background:rgba(199,116,0,.08);border-color:rgba(199,116,0,.25)}
|
|
678
|
+
.kp-chip.crit{background:rgba(229,72,77,.08);border-color:rgba(229,72,77,.3)}
|
|
679
|
+
.kp-chip .ico{font-size:14px;margin-top:1px}
|
|
680
|
+
.kp-chip .tx b{display:block;font-size:12px;margin-bottom:2px;font-weight:600}
|
|
681
|
+
.kp-chip .tx span{color:var(--dim);font-size:11px}
|
|
682
|
+
.kp-metric{display:flex;justify-content:space-between;align-items:center;padding:8px 0;font-size:12.5px;border-bottom:1px solid var(--line-soft)}
|
|
683
|
+
.kp-metric:last-child{border:0}
|
|
684
|
+
.kp-metric .lab{color:var(--dim)}
|
|
685
|
+
.kp-metric .val{font-weight:600;font-variant-numeric:tabular-nums}
|
|
686
|
+
.kp-route{display:flex;align-items:center;gap:8px;font-size:12px;padding:5px 0}
|
|
687
|
+
.kp-route .seq{width:20px;height:20px;border-radius:50%;display:grid;place-items:center;background:var(--accent-soft);color:var(--accent);font-size:9px;font-weight:700;flex-shrink:0}
|
|
688
|
+
.kp-empty{padding:18px;text-align:center;color:var(--faint);font-size:12px}
|
|
689
|
+
|
|
690
|
+
/* 治理卡 tc-* / markdown 管理 md-* / mcp-* */
|
|
691
|
+
.tc-wrap{display:grid;grid-template-columns:1fr 260px;gap:16px;height:100%}
|
|
692
|
+
.tc-col{min-width:0;overflow:auto}
|
|
693
|
+
.tc-h{font-size:14px;font-weight:700;margin-bottom:10px;letter-spacing:-.01em}
|
|
694
|
+
.tc-h span{color:var(--accent)}
|
|
695
|
+
.tc-row,.md-row,.mcp-row{background:var(--surface);border:1px solid var(--line-soft);border-radius:12px;padding:12px 14px;margin-bottom:8px;box-shadow:0 1px 2px rgba(0,0,0,.04)}
|
|
696
|
+
.tc-main{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
|
|
697
|
+
.tc-desc,.md-desc{font-size:11.5px;color:var(--dim);margin-top:4px}
|
|
698
|
+
.tc-badge,.conn-badge,.tc-trust,.tc-blk-tag{font-size:9px;padding:2px 7px;border-radius:7px;font-weight:600}
|
|
699
|
+
.tc-trust{color:#fff}
|
|
700
|
+
.tc-blk-tag{color:#fff;background:var(--red)}
|
|
701
|
+
.tc-blocked{opacity:.5;filter:grayscale(.4)}
|
|
702
|
+
.tc-acts,.md-acts{display:flex;gap:8px;flex-wrap:wrap}
|
|
703
|
+
.tc-del,.tc-deny,.md-view,.md-toggle,.md-del,.md-deny{font-size:10.5px;padding:4px 10px;border-radius:8px;border:0;cursor:pointer;font-weight:600;transition:transform .12s}
|
|
704
|
+
.tc-del:active,.md-view:active,.md-toggle:active,.md-del:active{transform:scale(.95)}
|
|
705
|
+
.md-view{background:var(--accent);color:#fff}.md-toggle{background:var(--green);color:#fff}
|
|
706
|
+
.md-del,.tc-blk-tag,.tc-del{background:var(--red);color:#fff}
|
|
707
|
+
.tc-deny,.md-deny{background:var(--amber);color:#fff}
|
|
708
|
+
.md-h{font-size:14px;font-weight:700;margin-bottom:8px}
|
|
709
|
+
.md-form,.mcp-form{display:flex;gap:6px;align-items:center;margin-bottom:8px}
|
|
710
|
+
.md-form input[type=file]{font-size:11px;flex:1;min-width:0}
|
|
711
|
+
#mdf-submit,#mcf-submit{font-size:11px;padding:6px 12px;border-radius:8px;border:0;cursor:pointer;background:var(--accent);color:#fff;font-weight:600;white-space:nowrap}
|
|
712
|
+
.mcp-url{font-size:11px;color:var(--dim);word-break:break-all}
|
|
713
|
+
.chat-mode{font-size:11px;font-weight:700;padding:5px 11px;border-radius:9px;cursor:pointer;white-space:nowrap;user-select:none;background:var(--green);color:#fff}
|
|
714
|
+
.chat-mode.task{background:var(--accent)}
|
|
715
|
+
|
|
716
|
+
/* 环形 / 指标 */
|
|
717
|
+
.eff{text-align:center;margin-bottom:12px}
|
|
718
|
+
.eff .ring{position:relative;width:96px;height:96px;margin:0 auto}
|
|
719
|
+
.eff .ring svg{transform:rotate(-90deg)}
|
|
720
|
+
.eff .ring .v{position:absolute;inset:0;display:grid;place-items:center}
|
|
721
|
+
.eff .ring .v b{font-size:24px;font-weight:700;letter-spacing:-.02em}
|
|
722
|
+
.eff .ring .v span{font-size:9px;color:var(--dim)}
|
|
723
|
+
.today .ring2{position:relative;width:130px;height:130px;margin:6px auto 14px}
|
|
724
|
+
.today .ring2 .v{position:absolute;inset:0;display:grid;place-items:center;text-align:center}
|
|
725
|
+
.today .ring2 .v b{font-size:30px;font-weight:700;letter-spacing:-.02em}
|
|
726
|
+
.today .ring2 .v span{font-size:10px;color:var(--dim)}
|
|
727
|
+
.metric{display:flex;align-items:center;gap:9px;margin:8px 0;font-size:12px}
|
|
728
|
+
.metric label{width:36px;color:var(--dim)}
|
|
729
|
+
.metric .bar{flex:1;height:6px;border-radius:3px;background:var(--surface-3);overflow:hidden}
|
|
730
|
+
.metric .bar i{display:block;height:100%;border-radius:3px;background:var(--accent)}
|
|
731
|
+
.metric .pct{width:34px;text-align:right;font-size:11px;font-variant-numeric:tabular-nums}
|
|
732
|
+
.legend{display:flex;align-items:center;justify-content:space-between;font-size:12px;padding:5px 0}
|
|
733
|
+
.legend .l{display:flex;align-items:center;gap:7px;color:var(--dim)}
|
|
734
|
+
.legend .l i{width:9px;height:9px;border-radius:3px}
|
|
735
|
+
.legend .n{font-weight:600}
|
|
736
|
+
.upcome,.recent{display:flex;gap:10px;padding:11px 0;border-bottom:1px solid var(--line-soft);font-size:12.5px}
|
|
737
|
+
.upcome:last-child,.recent:last-child{border:0}
|
|
738
|
+
.upcome .tm{color:var(--accent);min-width:44px;font-weight:600;font-variant-numeric:tabular-nums}
|
|
739
|
+
.upcome .ev{color:var(--dim)}
|
|
740
|
+
.recent .ri{width:28px;height:28px;border-radius:9px;display:grid;place-items:center;font-size:13px;background:var(--surface-2);flex-shrink:0}
|
|
741
|
+
.recent .rb{flex:1}.recent .rb b{font-size:12.5px;display:block;font-weight:600}.recent .rb span{font-size:10px;color:var(--faint)}
|
|
742
|
+
.recent .rt{font-size:10px;color:var(--faint);font-variant-numeric:tabular-nums}
|
|
743
|
+
|
|
744
|
+
/* 顶栏 Agent 紧凑条(若启用) */
|
|
745
|
+
.topbar-agents{flex:1 1 auto;min-width:0;display:flex;gap:7px;justify-content:center;align-items:center;overflow-x:auto;scrollbar-width:none;padding:0 4px}
|
|
746
|
+
.topbar-agents::-webkit-scrollbar{display:none}
|
|
747
|
+
.topbar-agents .acard{flex:0 0 auto;padding:6px 12px;border-radius:var(--r-pill);background:var(--surface-2);cursor:pointer;transition:.15s;display:flex;align-items:center;gap:7px}
|
|
748
|
+
.topbar-agents .acard:hover{background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.08)}
|
|
749
|
+
.topbar-agents .acard.on{background:var(--accent);color:#fff}
|
|
750
|
+
.topbar-agents .acard .acard-in{display:flex;align-items:center;gap:7px}
|
|
751
|
+
.topbar-agents .acard .face{width:22px;height:22px;border-radius:7px;background:var(--ac,var(--accent));flex-shrink:0}
|
|
752
|
+
.topbar-agents .acard .en,.topbar-agents .acard .role,.topbar-agents .acard .task-label,.topbar-agents .acard .crown,.topbar-agents .acard .face::before,.topbar-agents .acard .face::after,.topbar-agents .acard .face i.ant{display:none}
|
|
753
|
+
.topbar-agents .acard .nm{font-size:12.5px;font-weight:700}
|
|
754
|
+
.topbar-agents .acard .st{display:none}
|
|
755
|
+
|
|
756
|
+
/* 知识星球全屏(HKC 原版 iframe,保持其深色) */
|
|
757
|
+
.planet-ov{position:fixed;inset:64px 0 0 0;z-index:var(--z-top);display:none;background:rgba(20,20,24,.6);backdrop-filter:blur(4px)}
|
|
758
|
+
.planet-ov.on{display:block;animation:planetPop .3s cubic-bezier(.2,.9,.3,1.1)}
|
|
759
|
+
@keyframes planetPop{from{opacity:0;transform:scale(.96)}to{opacity:1;transform:none}}
|
|
760
|
+
.planet-ov .wrap{position:absolute;inset:16px 18px;border-radius:18px;overflow:hidden;box-shadow:var(--sh-pop)}
|
|
761
|
+
.planet-ov iframe{width:100%;height:100%;border:0;background:#0a0f1e;display:block}
|
|
762
|
+
.planet-ov .close{position:absolute;top:26px;right:32px;z-index:2;width:36px;height:36px;border-radius:10px;border:0;background:var(--glass-strong);backdrop-filter:blur(20px);color:var(--ink);cursor:pointer;font-size:15px}
|
|
763
|
+
.planet-ov .close:hover{background:#fff}
|
|
764
|
+
|
|
765
|
+
/* ═══ chat 输入框旁的下拉式模型选择器(图1+图2 风格)═══════════════════ */
|
|
766
|
+
.model-pick{position:relative;flex-shrink:0}
|
|
767
|
+
.mp-pill{display:flex;align-items:center;gap:7px;height:36px;padding:0 12px;border-radius:10px;background:var(--surface-2);border:1px solid var(--line);cursor:pointer;transition:.15s;user-select:none;font-size:12px;color:var(--ink);min-width:130px;max-width:200px}
|
|
768
|
+
.mp-pill:hover{background:var(--accent-soft);border-color:var(--accent)}
|
|
769
|
+
.mp-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;background:#7e93b8;box-shadow:0 0 6px #7e93b8;transition:.2s}
|
|
770
|
+
.mp-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600}
|
|
771
|
+
.mp-caret{font-size:9px;opacity:.6;transition:transform .2s}
|
|
772
|
+
.mp-pill:hover .mp-caret{transform:translateY(1px)}
|
|
773
|
+
|
|
774
|
+
.mp-menu{position:absolute;bottom:46px;left:0;width:300px;max-height:480px;overflow-y:auto;z-index:var(--z-menu);display:none;padding:6px;background:var(--glass-strong);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--line);border-radius:14px;box-shadow:var(--sh-pop);animation:popBL .22s cubic-bezier(.2,.8,.2,1) both;transform-origin:bottom left}
|
|
775
|
+
.mp-menu.show{display:block}
|
|
776
|
+
@keyframes popBL{from{opacity:0;transform:translateY(8px) scale(.96)}to{opacity:1;transform:none}}
|
|
777
|
+
|
|
778
|
+
.mp-item{display:flex;align-items:center;gap:10px;padding:9px 11px;border-radius:10px;cursor:pointer;transition:.14s;font-size:12px;position:relative}
|
|
779
|
+
.mp-item:hover{background:var(--surface-2)}
|
|
780
|
+
.mp-item.disabled{opacity:.4;cursor:not-allowed}
|
|
781
|
+
.mp-item.disabled:hover{background:transparent}
|
|
782
|
+
.mp-item.active{background:var(--accent-soft);border:1px solid var(--accent);padding:8px 10px}
|
|
783
|
+
.mp-item .mp-name{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
|
|
784
|
+
.mp-item .mp-name b{display:block;font-size:12.5px;font-weight:600;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
785
|
+
.mp-item .mp-name span{font-size:9.5px;color:var(--faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
786
|
+
.mp-tag{font-size:8.5px;padding:2px 7px;border-radius:6px;font-weight:600;flex-shrink:0;background:var(--accent-soft);color:var(--accent)}
|
|
787
|
+
.mp-tag.mp-cur{background:var(--green);color:#fff}
|
|
788
|
+
.mp-tag.mp-warn{background:rgba(199,116,0,.12);color:var(--amber)}
|
|
789
|
+
.mp-tag.mp-del{margin-left:6px;background:transparent;color:var(--faint);font-size:11px;padding:2px 5px;cursor:pointer}
|
|
790
|
+
.mp-tag.mp-del:hover{background:rgba(229,72,77,.15);color:var(--red)}
|
|
791
|
+
.mp-tag.mp-edit{margin-left:6px;background:transparent;color:var(--faint);font-size:11px;padding:2px 5px;cursor:pointer}
|
|
792
|
+
.mp-tag.mp-edit:hover{background:rgba(91,140,255,.18);color:#5b8cff}
|
|
793
|
+
.hidden{display:none !important}
|
|
794
|
+
|
|
795
|
+
.mp-sep{font-size:10px;color:var(--faint);padding:9px 11px 3px;text-transform:uppercase;letter-spacing:.5px;font-weight:600}
|
|
796
|
+
|
|
797
|
+
.mp-foot{display:flex;gap:6px;padding:8px 6px 2px;border-top:1px solid var(--line);margin-top:4px}
|
|
798
|
+
.mp-btn{flex:1;padding:7px 10px;border-radius:8px;border:1px solid var(--line);background:var(--surface-2);cursor:pointer;font-size:11px;color:var(--dim);transition:.14s;font-family:inherit}
|
|
799
|
+
.mp-btn:hover{background:var(--accent-soft);color:var(--accent);border-color:var(--accent)}
|
|
800
|
+
|
|
801
|
+
/* ═══ 「添加自定义模型」对话框(图2 风格)═══════════════════ */
|
|
802
|
+
.cm-mask{position:fixed;inset:0;z-index:var(--z-overlay);background:rgba(0,0,0,.55);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center}
|
|
803
|
+
.cm-mask.show{display:flex;animation:fadeIn .2s}
|
|
804
|
+
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
|
|
805
|
+
.cm-modal{width:480px;max-width:92vw;max-height:90vh;overflow:hidden;background:var(--glass-strong);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--line);border-radius:18px;box-shadow:var(--sh-pop);display:flex;flex-direction:column;animation:popMid .25s cubic-bezier(.2,.8,.2,1) both}
|
|
806
|
+
@keyframes popMid{from{opacity:0;transform:scale(.94)}to{opacity:1;transform:none}}
|
|
807
|
+
.cm-head{display:flex;align-items:center;justify-content:space-between;padding:18px 22px 0}
|
|
808
|
+
.cm-head h3{margin:0;font-size:15px;font-weight:600;color:var(--ink)}
|
|
809
|
+
.cm-close{width:28px;height:28px;border-radius:8px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--faint);transition:.14s;font-size:14px}
|
|
810
|
+
.cm-close:hover{background:var(--surface-2);color:var(--ink)}
|
|
811
|
+
.cm-sub{font-size:11px;color:var(--faint);padding:6px 22px 0;line-height:1.5}
|
|
812
|
+
.cm-sub code{background:var(--surface-2);padding:1px 5px;border-radius:4px;font-family:ui-monospace,monospace;font-size:10.5px}
|
|
813
|
+
.cm-body{flex:1;padding:14px 22px 6px;overflow-y:auto}
|
|
814
|
+
.cm-row{margin-bottom:12px}
|
|
815
|
+
.cm-row label{display:block;font-size:11px;color:var(--dim);margin-bottom:5px;font-weight:500}
|
|
816
|
+
.cm-row label em{color:var(--red);font-style:normal;margin-left:2px}
|
|
817
|
+
.cm-row input{width:100%;box-sizing:border-box;padding:8px 11px;border-radius:8px;border:1px solid var(--line);background:var(--surface);font-size:12px;color:var(--ink);transition:.14s;font-family:inherit}
|
|
818
|
+
.cm-row input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
|
|
819
|
+
.cm-row input::placeholder{color:var(--faint)}
|
|
820
|
+
.cm-pwd{position:relative}
|
|
821
|
+
.cm-pwd .cm-eye{position:absolute;right:8px;top:26px;cursor:pointer;padding:4px 6px;border-radius:6px;background:var(--surface-2);font-size:11px;user-select:none;line-height:1}
|
|
822
|
+
.cm-pwd .cm-eye:hover{background:var(--accent-soft)}
|
|
823
|
+
.cm-extra{margin-top:8px;border:1px solid var(--line);border-radius:10px;padding:0 12px;background:var(--surface-2)}
|
|
824
|
+
.cm-extra summary{padding:10px 0;cursor:pointer;font-size:11px;color:var(--dim);font-weight:500;user-select:none;list-style:none}
|
|
825
|
+
.cm-extra summary::-webkit-details-marker{display:none}
|
|
826
|
+
.cm-extra summary::before{content:"▸";margin-right:6px;display:inline-block;transition:transform .2s}
|
|
827
|
+
.cm-extra[open] summary::before{transform:rotate(90deg)}
|
|
828
|
+
.cm-extra summary:hover{color:var(--accent)}
|
|
829
|
+
.cm-extra[open] summary{padding-bottom:4px}
|
|
830
|
+
.cm-extra[open]{padding-bottom:8px}
|
|
831
|
+
.cm-msg{margin-top:10px;padding:8px 11px;border-radius:8px;font-size:11px;line-height:1.5;display:none;word-break:break-all}
|
|
832
|
+
.cm-msg.cm-msg-err{background:rgba(229,72,77,.1);color:var(--red);border:1px solid rgba(229,72,77,.2);display:block}
|
|
833
|
+
.cm-msg.cm-msg-ok{background:rgba(26,157,95,.1);color:var(--green);border:1px solid rgba(26,157,95,.2);display:block}
|
|
834
|
+
.cm-msg.cm-msg-info{background:var(--accent-soft);color:var(--accent);border:1px solid var(--accent-soft);display:block}
|
|
835
|
+
.cm-btns{display:flex;gap:8px;padding:14px 22px 18px;border-top:1px solid var(--line);margin-top:8px}
|
|
836
|
+
.cm-btns button{flex:1;padding:9px;border-radius:10px;border:0;cursor:pointer;font-size:12px;font-weight:600;transition:.14s;font-family:inherit}
|
|
837
|
+
.cm-cancel{background:var(--surface-2);color:var(--dim)}
|
|
838
|
+
.cm-cancel:hover{background:var(--line);color:var(--ink)}
|
|
839
|
+
.cm-test{background:var(--surface);color:var(--accent);border:1px solid var(--accent)!important}
|
|
840
|
+
.cm-test:hover{background:var(--accent-soft)}
|
|
841
|
+
.cm-save{background:var(--accent);color:#fff}
|
|
842
|
+
.cm-save:hover{background:var(--accent-deep);box-shadow:var(--sh-accent)}
|
|
843
|
+
|
|
844
|
+
/* ═══ 无障碍 ═══ */
|
|
845
|
+
@media (prefers-reduced-motion:reduce){
|
|
846
|
+
*,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}
|
|
847
|
+
.feed-track.rolling{animation:none!important}.feed-scroll{overflow:auto!important}
|
|
848
|
+
}
|
|
849
|
+
@media (prefers-reduced-transparency:reduce){
|
|
850
|
+
.topbar,.sm-btn,.sd-pop,.model-menu,.slash-menu,.tool-menu,.conn-panel,.core-chat,.core-stage,.reply-pop,.nav-flyout,.nav-menu,.map-search input,.map-search-results,.planet-ov .close{
|
|
851
|
+
backdrop-filter:none!important;-webkit-backdrop-filter:none!important;background:#fff!important}
|
|
852
|
+
}
|
|
853
|
+
@media (prefers-contrast:more){
|
|
854
|
+
:root{--dim:#48484d;--faint:#6a6a70;--line:rgba(0,0,0,.2);--line-soft:rgba(0,0,0,.14)}
|
|
855
|
+
}
|