foxclaw 0.1.0 → 0.1.2

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.
Files changed (495) hide show
  1. package/README.md +54 -29
  2. package/bin/foxclaw.cjs +51 -0
  3. package/index.js +11 -10
  4. package/package.json +46 -38
  5. package/python/.dockerignore +35 -0
  6. package/python/.env.example +165 -0
  7. package/python/.gitattributes +46 -0
  8. package/python/.github/workflows/ci.yml +122 -0
  9. package/python/.github/workflows/release.yml +183 -0
  10. package/python/Dockerfile +64 -0
  11. package/python/LICENSE +21 -0
  12. package/python/MANIFEST.in +14 -0
  13. package/python/README.md +192 -0
  14. package/python/README_CN.md +324 -0
  15. package/python/bench/bm25_audit.py +199 -0
  16. package/python/bench/bm25_regression.py +178 -0
  17. package/python/bench/bm25_stress.py +159 -0
  18. package/python/bench/cd_audit.py +238 -0
  19. package/python/bench/chaos.py +142 -0
  20. package/python/bench/concurrency.py +103 -0
  21. package/python/bench/e2e_real_models.py +95 -0
  22. package/python/bench/llm_retry_test.py +248 -0
  23. package/python/bench/load_test.py +196 -0
  24. package/python/bench/vector_ivf_upgrade.py +134 -0
  25. package/python/docs/CHANNELS.md +195 -0
  26. package/python/docs/GOVERNANCE.md +164 -0
  27. package/python/docs/RELEASE.md +109 -0
  28. package/python/docs/RUN.md +75 -0
  29. package/python/docs/RUN_CN.md +121 -0
  30. package/python/docs//351/205/215/347/275/256/346/214/207/345/215/227.md +152 -0
  31. package/python/evals/__init__.py +0 -0
  32. package/python/evals/governance/README.md +61 -0
  33. package/python/evals/governance/__init__.py +0 -0
  34. package/python/evals/governance/cases.py +152 -0
  35. package/python/evals/governance/compare_embeddings.py +94 -0
  36. package/python/evals/governance/convergence.svg +11 -0
  37. package/python/evals/governance/report.json +371 -0
  38. package/python/evals/governance/run_evals.py +400 -0
  39. package/python/examples/governance_middleware_demo.py +77 -0
  40. package/python/examples/langgraph_governance_demo.py +108 -0
  41. package/python/examples/sample_itinerary.csv +6 -0
  42. package/python/examples/sample_knowledge.csv +9 -0
  43. package/python/examples/sample_transactions.csv +14 -0
  44. package/python/foxclaw/__init__.py +526 -0
  45. package/python/foxclaw/agents/__init__.py +12 -0
  46. package/python/foxclaw/agents/agents.py +35 -0
  47. package/python/foxclaw/agents/base.py +865 -0
  48. package/python/foxclaw/agents/impl/__init__.py +1 -0
  49. package/python/foxclaw/agents/impl/_helpers.py +78 -0
  50. package/python/foxclaw/agents/impl/finance.py +248 -0
  51. package/python/foxclaw/agents/impl/office.py +367 -0
  52. package/python/foxclaw/agents/impl/supervisor.py +659 -0
  53. package/python/foxclaw/agents/mixins/_context.py +151 -0
  54. package/python/foxclaw/agents/mixins/augment.py +149 -0
  55. package/python/foxclaw/agents/mixins/llm.py +66 -0
  56. package/python/foxclaw/agents/mixins/memory.py +35 -0
  57. package/python/foxclaw/agents/mixins/preference.py +81 -0
  58. package/python/foxclaw/agents/mixins/prompt.py +77 -0
  59. package/python/foxclaw/agents/mixins/skillbox.py +58 -0
  60. package/python/foxclaw/agents/mixins/tool_exec.py +443 -0
  61. package/python/foxclaw/api/__init__.py +283 -0
  62. package/python/foxclaw/api/app.py +123 -0
  63. package/python/foxclaw/api/middleware.py +317 -0
  64. package/python/foxclaw/api/routes/ahs.py +417 -0
  65. package/python/foxclaw/api/routes/attachments.py +117 -0
  66. package/python/foxclaw/api/routes/browser.py +39 -0
  67. package/python/foxclaw/api/routes/domain.py +314 -0
  68. package/python/foxclaw/api/routes/knowledge.py +163 -0
  69. package/python/foxclaw/api/routes/llm_admin.py +461 -0
  70. package/python/foxclaw/api/routes/memory.py +89 -0
  71. package/python/foxclaw/api/routes/orchestration.py +41 -0
  72. package/python/foxclaw/api/routes/recovery.py +43 -0
  73. package/python/foxclaw/api/routes/review.py +275 -0
  74. package/python/foxclaw/api/routes/search.py +37 -0
  75. package/python/foxclaw/api/routes/system.py +327 -0
  76. package/python/foxclaw/api/routes/task.py +281 -0
  77. package/python/foxclaw/api/routes/ws.py +68 -0
  78. package/python/foxclaw/api/spine.py +55 -0
  79. package/python/foxclaw/browser/__init__.py +13 -0
  80. package/python/foxclaw/browser/action/__init__.py +1 -0
  81. package/python/foxclaw/browser/action/action_executor.py +54 -0
  82. package/python/foxclaw/browser/action/action_types.py +45 -0
  83. package/python/foxclaw/browser/action/action_verifier.py +68 -0
  84. package/python/foxclaw/browser/action/url_policy.py +147 -0
  85. package/python/foxclaw/browser/adapter/__init__.py +1 -0
  86. package/python/foxclaw/browser/adapter/base_adapter.py +23 -0
  87. package/python/foxclaw/browser/adapter/web_adapter.py +46 -0
  88. package/python/foxclaw/browser/driver/__init__.py +1 -0
  89. package/python/foxclaw/browser/driver/base_driver.py +61 -0
  90. package/python/foxclaw/browser/driver/playwright_driver.py +166 -0
  91. package/python/foxclaw/browser/perception/__init__.py +1 -0
  92. package/python/foxclaw/browser/perception/dom_extractor.py +43 -0
  93. package/python/foxclaw/browser/perception/element_indexer.py +57 -0
  94. package/python/foxclaw/browser/perception/semantic_reducer.py +33 -0
  95. package/python/foxclaw/browser/perception/snapshot.py +29 -0
  96. package/python/foxclaw/browser/service.py +148 -0
  97. package/python/foxclaw/browser/session/__init__.py +1 -0
  98. package/python/foxclaw/browser/session/session_manager.py +57 -0
  99. package/python/foxclaw/capability/__init__.py +12 -0
  100. package/python/foxclaw/capability/embedding_service.py +67 -0
  101. package/python/foxclaw/channels/__init__.py +140 -0
  102. package/python/foxclaw/channels/discord.py +184 -0
  103. package/python/foxclaw/channels/dispatcher.py +204 -0
  104. package/python/foxclaw/channels/feishu.py +225 -0
  105. package/python/foxclaw/channels/openclaw_bridge.py +156 -0
  106. package/python/foxclaw/channels/signing.py +187 -0
  107. package/python/foxclaw/channels/telegram.py +121 -0
  108. package/python/foxclaw/channels/weixin.py +225 -0
  109. package/python/foxclaw/cli.py +154 -0
  110. package/python/foxclaw/cognitive/__init__.py +4 -0
  111. package/python/foxclaw/cognitive/reasoner.py +82 -0
  112. package/python/foxclaw/cognitive/state.py +147 -0
  113. package/python/foxclaw/core/__init__.py +9 -0
  114. package/python/foxclaw/core/audit_chain.py +133 -0
  115. package/python/foxclaw/core/audit_sink.py +100 -0
  116. package/python/foxclaw/core/compaction.py +283 -0
  117. package/python/foxclaw/core/config.py +65 -0
  118. package/python/foxclaw/core/confirm_nonce.py +157 -0
  119. package/python/foxclaw/core/dispatch.py +27 -0
  120. package/python/foxclaw/core/envfile.py +48 -0
  121. package/python/foxclaw/core/failure_policy.py +151 -0
  122. package/python/foxclaw/core/gateway.py +85 -0
  123. package/python/foxclaw/core/governance_audit.py +175 -0
  124. package/python/foxclaw/core/idempotency.py +289 -0
  125. package/python/foxclaw/core/injection_guard.py +221 -0
  126. package/python/foxclaw/core/memory_adapter.py +516 -0
  127. package/python/foxclaw/core/metrics.py +89 -0
  128. package/python/foxclaw/core/model_router.py +1097 -0
  129. package/python/foxclaw/core/paths.py +103 -0
  130. package/python/foxclaw/core/recovery.py +362 -0
  131. package/python/foxclaw/core/scheduler.py +144 -0
  132. package/python/foxclaw/core/secrets.py +134 -0
  133. package/python/foxclaw/core/sessions.py +157 -0
  134. package/python/foxclaw/core/settings.py +430 -0
  135. package/python/foxclaw/core/shared_write.py +198 -0
  136. package/python/foxclaw/core/steering_queue.py +153 -0
  137. package/python/foxclaw/core/system_bus.py +84 -0
  138. package/python/foxclaw/core/thought_chain.py +318 -0
  139. package/python/foxclaw/core/token_meter.py +235 -0
  140. package/python/foxclaw/core/tools.py +172 -0
  141. package/python/foxclaw/core/tracing.py +390 -0
  142. package/python/foxclaw/core/truth_pipeline.py +114 -0
  143. package/python/foxclaw/core/vec_recall_adapter.py +503 -0
  144. package/python/foxclaw/core/verify.py +181 -0
  145. package/python/foxclaw/core/web_search.py +242 -0
  146. package/python/foxclaw/finance/__init__.py +15 -0
  147. package/python/foxclaw/finance/evidence.py +153 -0
  148. package/python/foxclaw/finance/fx.py +100 -0
  149. package/python/foxclaw/finance/graph.py +188 -0
  150. package/python/foxclaw/finance/models.py +150 -0
  151. package/python/foxclaw/finance/nlparse.py +575 -0
  152. package/python/foxclaw/finance/policy.py +329 -0
  153. package/python/foxclaw/finance/reasoner.py +129 -0
  154. package/python/foxclaw/finance/reasoning.py +340 -0
  155. package/python/foxclaw/finance/reconcile.py +180 -0
  156. package/python/foxclaw/finance/runtime.py +527 -0
  157. package/python/foxclaw/governance/__init__.py +24 -0
  158. package/python/foxclaw/governance/middleware.py +184 -0
  159. package/python/foxclaw/harness/__init__.py +17 -0
  160. package/python/foxclaw/harness/_base.py +72 -0
  161. package/python/foxclaw/harness/_policy.py +359 -0
  162. package/python/foxclaw/harness/drift.py +89 -0
  163. package/python/foxclaw/harness/event_bus.py +31 -0
  164. package/python/foxclaw/harness/harness.py +446 -0
  165. package/python/foxclaw/harness/loop_detection.py +152 -0
  166. package/python/foxclaw/itinerary/__init__.py +10 -0
  167. package/python/foxclaw/itinerary/amap_client.py +117 -0
  168. package/python/foxclaw/itinerary/models.py +80 -0
  169. package/python/foxclaw/itinerary/reasoner.py +101 -0
  170. package/python/foxclaw/itinerary/reasoning.py +174 -0
  171. package/python/foxclaw/itinerary/runtime.py +148 -0
  172. package/python/foxclaw/kernel/__init__.py +13 -0
  173. package/python/foxclaw/kernel/capabilities.py +73 -0
  174. package/python/foxclaw/kernel/policy_gate.py +114 -0
  175. package/python/foxclaw/kernel/process_manager.py +205 -0
  176. package/python/foxclaw/kernel/scheduler.py +131 -0
  177. package/python/foxclaw/kernel/sentinel.py +453 -0
  178. package/python/foxclaw/kernel/sentinel_client.py +246 -0
  179. package/python/foxclaw/kernel/spine.py +97 -0
  180. package/python/foxclaw/knowledge/__init__.py +376 -0
  181. package/python/foxclaw/knowledge/truth_crystallizer.py +92 -0
  182. package/python/foxclaw/learning/__init__.py +12 -0
  183. package/python/foxclaw/learning/knowledge_graph.py +149 -0
  184. package/python/foxclaw/learning/models.py +93 -0
  185. package/python/foxclaw/learning/reasoner.py +70 -0
  186. package/python/foxclaw/learning/runtime.py +363 -0
  187. package/python/foxclaw/learning/spaced_repetition.py +96 -0
  188. package/python/foxclaw/mcp_server.py +189 -0
  189. package/python/foxclaw/orchestration/__init__.py +184 -0
  190. package/python/foxclaw/pipeline/__init__.py +23 -0
  191. package/python/foxclaw/pipeline/cognitive_pipeline.py +481 -0
  192. package/python/foxclaw/pipeline/supervisor_stages.py +230 -0
  193. package/python/foxclaw/planning/__init__.py +17 -0
  194. package/python/foxclaw/planning/llm_planner.py +232 -0
  195. package/python/foxclaw/planning/planner.py +99 -0
  196. package/python/foxclaw/search/__init__.py +24 -0
  197. package/python/foxclaw/search/agent_port.py +194 -0
  198. package/python/foxclaw/search/evidence.py +113 -0
  199. package/python/foxclaw/search/external_search.py +50 -0
  200. package/python/foxclaw/search/hkc_read_port.py +60 -0
  201. package/python/foxclaw/search/internal_search.py +73 -0
  202. package/python/foxclaw/search/models.py +129 -0
  203. package/python/foxclaw/search/planner.py +44 -0
  204. package/python/foxclaw/search/retriever.py +39 -0
  205. package/python/foxclaw/search/runtime.py +134 -0
  206. package/python/foxclaw/search/strategy.py +44 -0
  207. package/python/foxclaw/skills/__init__.py +613 -0
  208. package/python/foxclaw/skills/hooks_spec.py +73 -0
  209. package/python/foxclaw/skills/lifecycle.py +278 -0
  210. package/python/foxclaw/skills/markdown_skill.py +174 -0
  211. package/python/foxclaw/skills/markdown_store.py +39 -0
  212. package/python/foxclaw/skills/mcp_client.py +190 -0
  213. package/python/foxclaw/skills/mcp_store.py +43 -0
  214. package/python/foxclaw/skills/permission.py +180 -0
  215. package/python/foxclaw/skills/pipeline.py +386 -0
  216. package/python/foxclaw/skills/policy.py +80 -0
  217. package/python/foxclaw/skills/review.py +72 -0
  218. package/python/foxclaw/skills/store.py +57 -0
  219. package/python/frontend/assets/core_bg.jpg +0 -0
  220. package/python/frontend/deck/auth.js +32 -0
  221. package/python/frontend/deck/chat_model_picker.js +537 -0
  222. package/python/frontend/deck/domain.js +296 -0
  223. package/python/frontend/deck/main.js +1950 -0
  224. package/python/frontend/deck/markdown.js +48 -0
  225. package/python/frontend/deck/settings.js +324 -0
  226. package/python/frontend/deck/state.js +6 -0
  227. package/python/frontend/deck/util.js +6 -0
  228. package/python/frontend/deck/visuals.js +212 -0
  229. package/python/frontend/deck.css +855 -0
  230. package/python/frontend/deck.html +686 -0
  231. package/python/frontend/deck_v2.html +341 -0
  232. package/python/frontend/planet/index.html +266 -0
  233. package/python/frontend/planet/planet.css +579 -0
  234. package/python/frontend/planet/planet.js +1637 -0
  235. package/python/frontend/planet/vendor/three.core.min.js +6 -0
  236. package/python/frontend/planet/vendor/three.module.min.js +6 -0
  237. package/python/frontend/v3/assets/index-BD7VPbMV.js +33 -0
  238. package/python/frontend/v3/assets/index-CAvnYWGH.css +1 -0
  239. package/python/frontend/v3/index.html +15 -0
  240. package/python/frontend/widget_runtime.js +295 -0
  241. package/python/frontend/widgets.js +696 -0
  242. package/python/frontend_src/index.html +14 -0
  243. package/python/frontend_src/package-lock.json +1376 -0
  244. package/python/frontend_src/package.json +19 -0
  245. package/python/frontend_src/src/App.vue +62 -0
  246. package/python/frontend_src/src/api.js +89 -0
  247. package/python/frontend_src/src/components/ChatDock.vue +377 -0
  248. package/python/frontend_src/src/components/ComposerMenu.vue +75 -0
  249. package/python/frontend_src/src/components/DocViewer.vue +171 -0
  250. package/python/frontend_src/src/components/Inspector.vue +241 -0
  251. package/python/frontend_src/src/components/LeftRail.vue +394 -0
  252. package/python/frontend_src/src/components/MenuPopover.vue +130 -0
  253. package/python/frontend_src/src/components/MessageStream.vue +401 -0
  254. package/python/frontend_src/src/components/ModelPicker.vue +355 -0
  255. package/python/frontend_src/src/components/QuickIngest.vue +118 -0
  256. package/python/frontend_src/src/components/Stage.vue +226 -0
  257. package/python/frontend_src/src/components/ToolMenu.vue +144 -0
  258. package/python/frontend_src/src/components/TopBar.vue +90 -0
  259. package/python/frontend_src/src/components/panels/ActivityPanel.vue +84 -0
  260. package/python/frontend_src/src/components/panels/AgentsPanel.vue +86 -0
  261. package/python/frontend_src/src/components/panels/KnowledgePanel.vue +441 -0
  262. package/python/frontend_src/src/components/panels/MemoryPanel.vue +118 -0
  263. package/python/frontend_src/src/components/panels/PanelBox.vue +51 -0
  264. package/python/frontend_src/src/components/panels/ReviewPanel.vue +308 -0
  265. package/python/frontend_src/src/components/panels/SettingsPanel.vue +254 -0
  266. package/python/frontend_src/src/components/panels/TasksPanel.vue +74 -0
  267. package/python/frontend_src/src/components/panels/ToolsPanel.vue +640 -0
  268. package/python/frontend_src/src/components/panels/UsagePanel.vue +105 -0
  269. package/python/frontend_src/src/lib/fmt.js +48 -0
  270. package/python/frontend_src/src/lib/md.js +204 -0
  271. package/python/frontend_src/src/main.js +7 -0
  272. package/python/frontend_src/src/stores/app.js +106 -0
  273. package/python/frontend_src/src/stores/chat.js +484 -0
  274. package/python/frontend_src/src/stores/model.js +104 -0
  275. package/python/frontend_src/src/stores/panels.js +330 -0
  276. package/python/frontend_src/src/styles/base.css +138 -0
  277. package/python/frontend_src/src/styles/panel.css +117 -0
  278. package/python/frontend_src/src/styles/tokens.css +78 -0
  279. package/python/frontend_src/vite.config.js +46 -0
  280. package/python/pyproject.toml +265 -0
  281. package/python/skills/README.md +123 -0
  282. package/python/skills/execution-contract/SKILL.md +30 -0
  283. package/python/skills/general-assistant/SKILL.md +34 -0
  284. package/python/skills/planner/SKILL.md +33 -0
  285. package/python/skills/schedule-itinerary/SKILL.md +35 -0
  286. package/python/skills/skill-composition/SKILL.md +31 -0
  287. package/python/skills/skill-guard/SKILL.md +67 -0
  288. package/python/skills/skill-memory/SKILL.md +50 -0
  289. package/python/skills/skill-router/SKILL.md +35 -0
  290. package/python/tests/conftest.py +76 -0
  291. package/python/tests/run_all.py +263 -0
  292. package/python/tests/test_agent_lifecycle.py +360 -0
  293. package/python/tests/test_ahs_p2.py +414 -0
  294. package/python/tests/test_anthropic_tools.py +206 -0
  295. package/python/tests/test_api.py +87 -0
  296. package/python/tests/test_api_auth.py +83 -0
  297. package/python/tests/test_api_host_guard.py +69 -0
  298. package/python/tests/test_attachments.py +167 -0
  299. package/python/tests/test_audit_chain.py +121 -0
  300. package/python/tests/test_audit_sink.py +136 -0
  301. package/python/tests/test_browser.py +153 -0
  302. package/python/tests/test_browser_request_guard.py +184 -0
  303. package/python/tests/test_capabilities.py +158 -0
  304. package/python/tests/test_channel_signing.py +192 -0
  305. package/python/tests/test_channel_trust.py +109 -0
  306. package/python/tests/test_channels.py +184 -0
  307. package/python/tests/test_cli.py +46 -0
  308. package/python/tests/test_compaction_toolpair.py +119 -0
  309. package/python/tests/test_config_layering.py +65 -0
  310. package/python/tests/test_confirm_nonce.py +197 -0
  311. package/python/tests/test_context_compaction_wiring.py +130 -0
  312. package/python/tests/test_dispatch.py +95 -0
  313. package/python/tests/test_domain_evals.py +403 -0
  314. package/python/tests/test_domain_import.py +78 -0
  315. package/python/tests/test_domain_reasoners.py +148 -0
  316. package/python/tests/test_e2e.py +178 -0
  317. package/python/tests/test_emb_cache.py +107 -0
  318. package/python/tests/test_embedding_singleton.py +89 -0
  319. package/python/tests/test_envfile.py +83 -0
  320. package/python/tests/test_evals_smoke.py +114 -0
  321. package/python/tests/test_event_spine.py +182 -0
  322. package/python/tests/test_evidence_semantic.py +101 -0
  323. package/python/tests/test_evidence_sse.py +97 -0
  324. package/python/tests/test_file_ingest.py +146 -0
  325. package/python/tests/test_finance.py +153 -0
  326. package/python/tests/test_finance_ledger.py +252 -0
  327. package/python/tests/test_finance_persist.py +178 -0
  328. package/python/tests/test_gateway.py +144 -0
  329. package/python/tests/test_governance.py +468 -0
  330. package/python/tests/test_governance_audit.py +359 -0
  331. package/python/tests/test_governance_middleware.py +143 -0
  332. package/python/tests/test_hkc.py +286 -0
  333. package/python/tests/test_hkc_index_build_manager.py +339 -0
  334. package/python/tests/test_hkc_manifest_reuse.py +317 -0
  335. package/python/tests/test_hkc_search_event_sync.py +533 -0
  336. package/python/tests/test_import_path_guard.py +161 -0
  337. package/python/tests/test_injection_guard.py +211 -0
  338. package/python/tests/test_integration.py +141 -0
  339. package/python/tests/test_itinerary.py +103 -0
  340. package/python/tests/test_kee_semantic.py +89 -0
  341. package/python/tests/test_kernel.py +222 -0
  342. package/python/tests/test_learning.py +110 -0
  343. package/python/tests/test_llm_admin.py +160 -0
  344. package/python/tests/test_llm_planner.py +366 -0
  345. package/python/tests/test_markdown_skills.py +73 -0
  346. package/python/tests/test_markdown_skills_openclaw.py +71 -0
  347. package/python/tests/test_mcp_connectors.py +109 -0
  348. package/python/tests/test_mcp_guardian_discovery.py +91 -0
  349. package/python/tests/test_mcp_no_memory.py +43 -0
  350. package/python/tests/test_mcp_policy_gate.py +77 -0
  351. package/python/tests/test_mcp_server.py +95 -0
  352. package/python/tests/test_memory_recall.py +95 -0
  353. package/python/tests/test_metrics.py +66 -0
  354. package/python/tests/test_multi_chain.py +102 -0
  355. package/python/tests/test_multimodal.py +135 -0
  356. package/python/tests/test_negotiation.py +146 -0
  357. package/python/tests/test_orchestration.py +119 -0
  358. package/python/tests/test_orchestration_decoupled.py +109 -0
  359. package/python/tests/test_p3_p5_hardening.py +338 -0
  360. package/python/tests/test_parallel_dispatch.py +215 -0
  361. package/python/tests/test_pipeline.py +533 -0
  362. package/python/tests/test_plan_visible.py +86 -0
  363. package/python/tests/test_planner.py +95 -0
  364. package/python/tests/test_policy_gate.py +109 -0
  365. package/python/tests/test_reasoner.py +185 -0
  366. package/python/tests/test_release_check.py +263 -0
  367. package/python/tests/test_resume_checkpoint.py +156 -0
  368. package/python/tests/test_routing.py +95 -0
  369. package/python/tests/test_scheduler.py +141 -0
  370. package/python/tests/test_search.py +204 -0
  371. package/python/tests/test_secrets.py +159 -0
  372. package/python/tests/test_semantic.py +78 -0
  373. package/python/tests/test_sessions.py +91 -0
  374. package/python/tests/test_settings.py +281 -0
  375. package/python/tests/test_shadow_learning.py +330 -0
  376. package/python/tests/test_shared_write.py +207 -0
  377. package/python/tests/test_skill_taint_gate.py +154 -0
  378. package/python/tests/test_skills.py +133 -0
  379. package/python/tests/test_stats_and_events.py +165 -0
  380. package/python/tests/test_streaming.py +60 -0
  381. package/python/tests/test_supervisor_pipeline.py +177 -0
  382. package/python/tests/test_supervisor_triage.py +108 -0
  383. package/python/tests/test_taint.py +117 -0
  384. package/python/tests/test_task_stream.py +85 -0
  385. package/python/tests/test_thinking_sse.py +67 -0
  386. package/python/tests/test_thinking_stream.py +76 -0
  387. package/python/tests/test_tool_center.py +129 -0
  388. package/python/tests/test_tool_parallel.py +113 -0
  389. package/python/tests/test_tool_params.py +103 -0
  390. package/python/tests/test_tool_use.py +242 -0
  391. package/python/tests/test_toplevel_concurrency.py +117 -0
  392. package/python/tests/test_tracing.py +290 -0
  393. package/python/tests/test_truth_crystallizer.py +127 -0
  394. package/python/tests/test_truth_flow.py +93 -0
  395. package/python/tests/test_url_policy.py +53 -0
  396. package/python/tests/test_verify_evidence.py +225 -0
  397. package/python/tests/test_version_sync.py +71 -0
  398. package/python/tests/test_web_trigger.py +99 -0
  399. package/python/tools/check_faiss_type.py +31 -0
  400. package/python/tools/check_log.ps1 +46 -0
  401. package/python/tools/ivf_status.py +72 -0
  402. package/python/tools/mypy_baseline.txt +5 -0
  403. package/python/tools/mypy_ratchet.py +97 -0
  404. package/python/tools/pack.py +178 -0
  405. package/python/tools/release_check.py +349 -0
  406. package/python/tools/restart_foxclaw.ps1 +74 -0
  407. package/python/tools/shared_write_audit.py +204 -0
  408. package/python/tools/size_baseline.txt +28 -0
  409. package/python/tools/size_check.py +102 -0
  410. package/python/tools/verify_env.bat +2 -0
  411. package/python/tools/verify_env.py +25 -0
  412. package/python/vendor/HMR_LICENSE +37 -0
  413. package/python/vendor/HMR_README.md +65 -0
  414. package/python/vendor/hkc/LICENSE +37 -0
  415. package/python/vendor/hkc/hkc_ace/__init__.py +0 -0
  416. package/python/vendor/hkc/hkc_ace/ace.py +457 -0
  417. package/python/vendor/hkc/hkc_ace/skill_taxonomy.json +465 -0
  418. package/python/vendor/hkc/hkc_api/__init__.py +0 -0
  419. package/python/vendor/hkc/hkc_api/container.py +416 -0
  420. package/python/vendor/hkc/hkc_api/ingest_jobs.py +103 -0
  421. package/python/vendor/hkc/hkc_api/main.py +157 -0
  422. package/python/vendor/hkc/hkc_api/routes/__init__.py +0 -0
  423. package/python/vendor/hkc/hkc_api/routes/ability.py +151 -0
  424. package/python/vendor/hkc/hkc_api/routes/config.py +51 -0
  425. package/python/vendor/hkc/hkc_api/routes/knowledge.py +630 -0
  426. package/python/vendor/hkc/hkc_api/routes/search.py +88 -0
  427. package/python/vendor/hkc/hkc_api/schemas.py +153 -0
  428. package/python/vendor/hkc/hkc_api/synthesis.py +179 -0
  429. package/python/vendor/hkc/hkc_core/__init__.py +0 -0
  430. package/python/vendor/hkc/hkc_core/graph/__init__.py +0 -0
  431. package/python/vendor/hkc/hkc_core/graph/base.py +188 -0
  432. package/python/vendor/hkc/hkc_core/graph/sqlite_store.py +789 -0
  433. package/python/vendor/hkc/hkc_core/models/__init__.py +0 -0
  434. package/python/vendor/hkc/hkc_core/models/enums.py +65 -0
  435. package/python/vendor/hkc/hkc_core/models/ku.py +307 -0
  436. package/python/vendor/hkc/hkc_core/utils/__init__.py +0 -0
  437. package/python/vendor/hkc/hkc_core/utils/id_gen.py +113 -0
  438. package/python/vendor/hkc/hkc_crystallizer/__init__.py +44 -0
  439. package/python/vendor/hkc/hkc_crystallizer/adapters.py +94 -0
  440. package/python/vendor/hkc/hkc_crystallizer/candidate.py +145 -0
  441. package/python/vendor/hkc/hkc_crystallizer/crystallizer.py +179 -0
  442. package/python/vendor/hkc/hkc_crystallizer/ingress.py +90 -0
  443. package/python/vendor/hkc/hkc_kde/__init__.py +0 -0
  444. package/python/vendor/hkc/hkc_kde/chunker.py +197 -0
  445. package/python/vendor/hkc/hkc_kde/extractor.py +623 -0
  446. package/python/vendor/hkc/hkc_kde/kde.py +298 -0
  447. package/python/vendor/hkc/hkc_kde/loaders/__init__.py +0 -0
  448. package/python/vendor/hkc/hkc_kde/loaders/ebook_loader.py +153 -0
  449. package/python/vendor/hkc/hkc_kde/loaders/office_loader.py +194 -0
  450. package/python/vendor/hkc/hkc_kde/loaders/pdf_loader.py +162 -0
  451. package/python/vendor/hkc/hkc_kde/loaders/text_loader.py +157 -0
  452. package/python/vendor/hkc/hkc_kde/loaders/web_loader.py +91 -0
  453. package/python/vendor/hkc/hkc_kde/models.py +74 -0
  454. package/python/vendor/hkc/hkc_kde/packager.py +329 -0
  455. package/python/vendor/hkc/hkc_kde/relation_disc.py +151 -0
  456. package/python/vendor/hkc/hkc_kee/__init__.py +0 -0
  457. package/python/vendor/hkc/hkc_kee/dedup.py +227 -0
  458. package/python/vendor/hkc/hkc_kee/fingerprint.py +106 -0
  459. package/python/vendor/hkc/hkc_kee/kee.py +541 -0
  460. package/python/vendor/hkc/hkc_kep/__init__.py +0 -0
  461. package/python/vendor/hkc/hkc_kep/event_bus.py +205 -0
  462. package/python/vendor/hkc/hkc_sdk/__init__.py +63 -0
  463. package/python/vendor/hkc/hkc_sdk/base.py +151 -0
  464. package/python/vendor/hkc/hkc_sdk/direct_client.py +153 -0
  465. package/python/vendor/hkc/hkc_sdk/exceptions.py +39 -0
  466. package/python/vendor/hkc/hkc_sdk/http_client.py +166 -0
  467. package/python/vendor/hkc/hkc_sdk/models.py +171 -0
  468. package/python/vendor/hkc/hkc_search/__init__.py +0 -0
  469. package/python/vendor/hkc/hkc_search/bm25.py +325 -0
  470. package/python/vendor/hkc/hkc_search/embedding_backends.py +374 -0
  471. package/python/vendor/hkc/hkc_search/graph_search.py +132 -0
  472. package/python/vendor/hkc/hkc_search/hybrid.py +331 -0
  473. package/python/vendor/hkc/hkc_search/index_build_manager.py +378 -0
  474. package/python/vendor/hkc/hkc_search/vector_search.py +484 -0
  475. package/python/vendor/hmr/__init__.py +0 -0
  476. package/python/vendor/hmr/core/__init__.py +0 -0
  477. package/python/vendor/hmr/core/hmr.py +684 -0
  478. package/python/vendor/hmr/core/models.py +310 -0
  479. package/python/vendor/hmr/engines/__init__.py +0 -0
  480. package/python/vendor/hmr/engines/evolution.py +710 -0
  481. package/python/vendor/hmr/engines/jit_compiler.py +472 -0
  482. package/python/vendor/hmr/engines/lifecycle.py +264 -0
  483. package/python/vendor/hmr/engines/policy.py +625 -0
  484. package/python/vendor/hmr/engines/recall.py +260 -0
  485. package/python/vendor/hmr/engines/runtime_state.py +158 -0
  486. package/python/vendor/hmr/engines/scheduler.py +323 -0
  487. package/python/vendor/hmr/engines/semantic.py +150 -0
  488. package/python/vendor/hmr/engines/temporal.py +261 -0
  489. package/python/vendor/hmr/engines/thought_chain.py +635 -0
  490. package/python/vendor/hmr/graph/__init__.py +0 -0
  491. package/python/vendor/hmr/graph/cwg.py +338 -0
  492. package/python/vendor/hmr/graph/memory_graph.py +530 -0
  493. package/python/vendor/hmr/storage/__init__.py +0 -0
  494. package/python/vendor/hmr/storage/memory_fs.py +300 -0
  495. 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
+ }