@bolloon/bolloon-agent 0.1.36 → 0.1.37

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 (530) hide show
  1. package/dist/web/client.js +2861 -3746
  2. package/dist/web/components/p2p/index.js +226 -264
  3. package/dist/web/ui/message-renderer.js +323 -434
  4. package/dist/web/ui/step-timeline.js +255 -351
  5. package/package.json +2 -2
  6. package/.auto-evolve-calls +0 -1
  7. package/.last-auto-evolve-baseline +0 -1
  8. package/.playwright-mcp/page-2026-06-16T07-51-45-706Z.yml +0 -130
  9. package/.playwright-mcp/page-2026-06-16T07-56-44-116Z.yml +0 -131
  10. package/Bolloon.md +0 -144
  11. package/Dive-into/CITATION.cff +0 -17
  12. package/Dive-into/LICENSE +0 -25
  13. package/Dive-into/README.md +0 -598
  14. package/Dive-into/README_zh.md +0 -599
  15. package/Dive-into/assets/context.png +0 -0
  16. package/Dive-into/assets/extensibility.png +0 -0
  17. package/Dive-into/assets/iteration.png +0 -0
  18. package/Dive-into/assets/layered_architecture.png +0 -0
  19. package/Dive-into/assets/main_structure.png +0 -0
  20. package/Dive-into/assets/permission.png +0 -0
  21. package/Dive-into/assets/session_compact.png +0 -0
  22. package/Dive-into/assets/subagent.png +0 -0
  23. package/Dive-into/paper/Dive_into_Claude_Code.pdf +0 -0
  24. package/dist/agents/constraint-layer.js.map +0 -1
  25. package/dist/agents/pi-sdk.js.map +0 -1
  26. package/dist/agents/workflow-engine.js.map +0 -1
  27. package/dist/bollharness/src/index.js +0 -5
  28. package/dist/bollharness/src/scripts/checks/check_adr_plan_numbering.js +0 -6
  29. package/dist/bollharness/src/scripts/checks/check_api_types.js +0 -45
  30. package/dist/bollharness/src/scripts/checks/check_artifact_link.js +0 -146
  31. package/dist/bollharness/src/scripts/checks/check_bridge_deps.js +0 -6
  32. package/dist/bollharness/src/scripts/checks/check_bugfix_binding.js +0 -6
  33. package/dist/bollharness/src/scripts/checks/check_bugfix_binding_ci.js +0 -6
  34. package/dist/bollharness/src/scripts/checks/check_doc_file_references.js +0 -6
  35. package/dist/bollharness/src/scripts/checks/check_doc_freshness.js +0 -135
  36. package/dist/bollharness/src/scripts/checks/check_doc_links.js +0 -31
  37. package/dist/bollharness/src/scripts/checks/check_file_existence_claims.js +0 -6
  38. package/dist/bollharness/src/scripts/checks/check_fragment_integrity.js +0 -34
  39. package/dist/bollharness/src/scripts/checks/check_hook_installed.js +0 -63
  40. package/dist/bollharness/src/scripts/checks/check_issue_closure.js +0 -41
  41. package/dist/bollharness/src/scripts/checks/check_mcp_parity.js +0 -6
  42. package/dist/bollharness/src/scripts/checks/check_security.js +0 -48
  43. package/dist/bollharness/src/scripts/checks/check_skill_parity.js +0 -6
  44. package/dist/bollharness/src/scripts/checks/check_versions.js +0 -6
  45. package/dist/bollharness/src/scripts/checks/finding.js +0 -13
  46. package/dist/bollharness/src/scripts/checks/next_decision_number.js +0 -20
  47. package/dist/bollharness/src/scripts/checks/regenerate_magic_docs.js +0 -6
  48. package/dist/bollharness/src/scripts/ci/detect_rebaseline_triggers.js +0 -8
  49. package/dist/bollharness/src/scripts/ci/scan_subprocess_cfg.js +0 -8
  50. package/dist/bollharness/src/scripts/ci/scan_verify_artifacts.js +0 -8
  51. package/dist/bollharness/src/scripts/ci/scan_yaml_schema.js +0 -8
  52. package/dist/bollharness/src/scripts/context_router.js +0 -67
  53. package/dist/bollharness/src/scripts/deploy-guard.js +0 -157
  54. package/dist/bollharness/src/scripts/guard-feedback.js +0 -192
  55. package/dist/bollharness/src/scripts/guard_router.js +0 -158
  56. package/dist/bollharness/src/scripts/hooks/_hook_output.js +0 -6
  57. package/dist/bollharness/src/scripts/hooks/auto-python3.js +0 -6
  58. package/dist/bollharness/src/scripts/hooks/deploy-progress-on-session-end.js +0 -6
  59. package/dist/bollharness/src/scripts/hooks/failure-analyzer.js +0 -6
  60. package/dist/bollharness/src/scripts/hooks/gate-judgment-inject.js +0 -92
  61. package/dist/bollharness/src/scripts/hooks/gate-transition-judgment.js +0 -63
  62. package/dist/bollharness/src/scripts/hooks/inbox-ack.js +0 -6
  63. package/dist/bollharness/src/scripts/hooks/inbox-inject-on-start.js +0 -6
  64. package/dist/bollharness/src/scripts/hooks/inbox-validate.js +0 -6
  65. package/dist/bollharness/src/scripts/hooks/inbox-write-ledger.js +0 -6
  66. package/dist/bollharness/src/scripts/hooks/initializer-agent.js +0 -6
  67. package/dist/bollharness/src/scripts/hooks/loop-detection.js +0 -73
  68. package/dist/bollharness/src/scripts/hooks/owner-guard.js +0 -6
  69. package/dist/bollharness/src/scripts/hooks/precompact.js +0 -6
  70. package/dist/bollharness/src/scripts/hooks/review-agent-gatekeeper.js +0 -6
  71. package/dist/bollharness/src/scripts/hooks/risk-tracker.js +0 -108
  72. package/dist/bollharness/src/scripts/hooks/sanitize-on-read.js +0 -6
  73. package/dist/bollharness/src/scripts/hooks/session-reflection.js +0 -7
  74. package/dist/bollharness/src/scripts/hooks/session-start-magic-docs.js +0 -7
  75. package/dist/bollharness/src/scripts/hooks/session-start-reset-risk.js +0 -7
  76. package/dist/bollharness/src/scripts/hooks/session-start-toolkit-reminder.js +0 -7
  77. package/dist/bollharness/src/scripts/hooks/stop-evaluator.js +0 -157
  78. package/dist/bollharness/src/scripts/hooks/tool-call-counter.js +0 -6
  79. package/dist/bollharness/src/scripts/hooks/trace-analyzer.js +0 -10
  80. package/dist/bollharness/src/scripts/install/install-trust-token.js +0 -7
  81. package/dist/bollharness/src/scripts/install/multi_project_registry.js +0 -9
  82. package/dist/bollharness/src/scripts/install/phase2_auto.js +0 -21
  83. package/dist/bollharness/src/scripts/install/pre_commit_installer.js +0 -6
  84. package/dist/bollharness/src/scripts/install/tier_selector.js +0 -7
  85. package/dist/bollharness/src/scripts/install/transcript_miner.js +0 -7
  86. package/dist/bollharness/src/scripts/lib/claim_patterns.js +0 -10
  87. package/dist/bollharness/src/scripts/lib/sanitize_patterns.js +0 -12
  88. package/dist/bollharness/src/scripts/sanitize.js +0 -6
  89. package/dist/bollharness-integration/context-router-judgment.js.map +0 -1
  90. package/dist/bollharness-integration/context-router.js.map +0 -1
  91. package/dist/bollharness-integration/gate-state-machine.js.map +0 -1
  92. package/dist/bollharness-integration/gate-transition-hooks.js.map +0 -1
  93. package/dist/bollharness-integration/guard-checker.js.map +0 -1
  94. package/dist/bollharness-integration/index.js.map +0 -1
  95. package/dist/bollharness-integration/integration.js.map +0 -1
  96. package/dist/bollharness-integration/llm/pi-ai.d.ts +0 -60
  97. package/dist/bollharness-integration/pi-ecosystem-colony/index.d.ts +0 -153
  98. package/dist/bollharness-integration/pi-ecosystem-goals/index.d.ts +0 -136
  99. package/dist/bollharness-integration/pi-ecosystem-judgment/decision.d.ts +0 -117
  100. package/dist/bollharness-integration/pi-ecosystem-judgment/distillation.d.ts +0 -78
  101. package/dist/bollharness-integration/pi-ecosystem-judgment/index.d.ts +0 -139
  102. package/dist/bollharness-integration/pi-ecosystem-mcp/index.d.ts +0 -127
  103. package/dist/bollharness-integration/pi-ecosystem-subagents/index.d.ts +0 -95
  104. package/dist/bollharness-integration/skill-adapter.js.map +0 -1
  105. package/dist/constraint-runtime/src/_archive_helper.js +0 -9
  106. package/dist/constraint-runtime/src/agent/coordinator.js +0 -48
  107. package/dist/constraint-runtime/src/agent/index.js +0 -1
  108. package/dist/constraint-runtime/src/assistant/index.js +0 -12
  109. package/dist/constraint-runtime/src/bootstrap/index.js +0 -12
  110. package/dist/constraint-runtime/src/bootstrap_graph.js +0 -13
  111. package/dist/constraint-runtime/src/bridge/index.js +0 -12
  112. package/dist/constraint-runtime/src/buddy/index.js +0 -12
  113. package/dist/constraint-runtime/src/cli/index.js +0 -12
  114. package/dist/constraint-runtime/src/command_graph.js +0 -10
  115. package/dist/constraint-runtime/src/commands.js +0 -60
  116. package/dist/constraint-runtime/src/components/index.js +0 -12
  117. package/dist/constraint-runtime/src/constants/index.js +0 -12
  118. package/dist/constraint-runtime/src/constraint/budget.js +0 -22
  119. package/dist/constraint-runtime/src/constraint/budget.js.map +0 -1
  120. package/dist/constraint-runtime/src/constraint/index.js +0 -2
  121. package/dist/constraint-runtime/src/constraint/permission.js +0 -20
  122. package/dist/constraint-runtime/src/constraint/permission.js.map +0 -1
  123. package/dist/constraint-runtime/src/context.js +0 -30
  124. package/dist/constraint-runtime/src/coordinator/index.js +0 -12
  125. package/dist/constraint-runtime/src/cost_hook.js +0 -4
  126. package/dist/constraint-runtime/src/cost_tracker.js +0 -8
  127. package/dist/constraint-runtime/src/deferred_init.js +0 -10
  128. package/dist/constraint-runtime/src/direct_modes.js +0 -6
  129. package/dist/constraint-runtime/src/dynamic-tool-loader.js +0 -85
  130. package/dist/constraint-runtime/src/entrypoints/index.js +0 -12
  131. package/dist/constraint-runtime/src/execution_registry.js +0 -44
  132. package/dist/constraint-runtime/src/history.js +0 -9
  133. package/dist/constraint-runtime/src/hooks/index.js +0 -12
  134. package/dist/constraint-runtime/src/index.js +0 -26
  135. package/dist/constraint-runtime/src/ink.js +0 -4
  136. package/dist/constraint-runtime/src/keybindings/index.js +0 -12
  137. package/dist/constraint-runtime/src/memdir/index.js +0 -12
  138. package/dist/constraint-runtime/src/migrations/index.js +0 -12
  139. package/dist/constraint-runtime/src/models.js +0 -1
  140. package/dist/constraint-runtime/src/models.js.map +0 -1
  141. package/dist/constraint-runtime/src/moreright/index.js +0 -12
  142. package/dist/constraint-runtime/src/native_ts/index.js +0 -12
  143. package/dist/constraint-runtime/src/output_styles/index.js +0 -12
  144. package/dist/constraint-runtime/src/parity_audit.js +0 -12
  145. package/dist/constraint-runtime/src/plugins/index.js +0 -12
  146. package/dist/constraint-runtime/src/port_manifest.js +0 -11
  147. package/dist/constraint-runtime/src/prefetch.js +0 -9
  148. package/dist/constraint-runtime/src/query.js +0 -1
  149. package/dist/constraint-runtime/src/remote/index.js +0 -12
  150. package/dist/constraint-runtime/src/remote_runtime.js +0 -9
  151. package/dist/constraint-runtime/src/runtime/index.js +0 -1
  152. package/dist/constraint-runtime/src/runtime/session.js +0 -35
  153. package/dist/constraint-runtime/src/schemas/index.js +0 -12
  154. package/dist/constraint-runtime/src/screens/index.js +0 -12
  155. package/dist/constraint-runtime/src/server/index.js +0 -12
  156. package/dist/constraint-runtime/src/services/index.js +0 -12
  157. package/dist/constraint-runtime/src/session_store.js +0 -22
  158. package/dist/constraint-runtime/src/setup.js +0 -30
  159. package/dist/constraint-runtime/src/skills/index.js +0 -1
  160. package/dist/constraint-runtime/src/skills/skill-registry.js +0 -28
  161. package/dist/constraint-runtime/src/state/index.js +0 -12
  162. package/dist/constraint-runtime/src/system_init.js +0 -20
  163. package/dist/constraint-runtime/src/thinking/engine.js +0 -42
  164. package/dist/constraint-runtime/src/thinking/index.js +0 -1
  165. package/dist/constraint-runtime/src/tool_pool.js +0 -8
  166. package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +0 -7
  167. package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +0 -7
  168. package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +0 -7
  169. package/dist/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.js +0 -6
  170. package/dist/constraint-runtime/src/tools/PolymarketSDK/createOrder.js +0 -6
  171. package/dist/constraint-runtime/src/tools/PolymarketSDK/getMarket.js +0 -5
  172. package/dist/constraint-runtime/src/tools/PolymarketSDK/getOrders.js +0 -6
  173. package/dist/constraint-runtime/src/tools/PolymarketSDK/listMarkets.js +0 -4
  174. package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +0 -6
  175. package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +0 -8
  176. package/dist/constraint-runtime/src/tools/SafeSDK/deploySafe.js +0 -6
  177. package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +0 -6
  178. package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +0 -6
  179. package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +0 -6
  180. package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +0 -6
  181. package/dist/constraint-runtime/src/tools/WalletTools/autoPay.js +0 -29
  182. package/dist/constraint-runtime/src/tools/WalletTools/createWallet.js +0 -10
  183. package/dist/constraint-runtime/src/tools/WalletTools/getBalance.js +0 -13
  184. package/dist/constraint-runtime/src/tools/WalletTools/importWallet.js +0 -22
  185. package/dist/constraint-runtime/src/tools/WalletTools/sendTransaction.js +0 -25
  186. package/dist/constraint-runtime/src/tools/WalletTools/signMessage.js +0 -10
  187. package/dist/constraint-runtime/src/tools/WalletTools/transferToken.js +0 -25
  188. package/dist/constraint-runtime/src/tools.js +0 -80
  189. package/dist/constraint-runtime/src/transcript.js +0 -19
  190. package/dist/constraint-runtime/src/types/index.js +0 -12
  191. package/dist/constraint-runtime/src/upstream_proxy/index.js +0 -12
  192. package/dist/constraint-runtime/src/utils/index.js +0 -12
  193. package/dist/constraint-runtime/src/vim/index.js +0 -12
  194. package/dist/constraint-runtime/src/voice/index.js +0 -12
  195. package/dist/constraints/index.js.map +0 -1
  196. package/dist/documents/reader.js.map +0 -1
  197. package/dist/llm/config-store.js.map +0 -1
  198. package/dist/llm/pi-ai.js.map +0 -1
  199. package/dist/network/agent-network.js.map +0 -1
  200. package/dist/network/iroh-integration.js.map +0 -1
  201. package/dist/network/iroh-transport.js.map +0 -1
  202. package/dist/network/p2p.js.map +0 -1
  203. package/dist/network/storage/adapters/json-adapter.js.map +0 -1
  204. package/dist/pi-ecosystem-colony/index.js.map +0 -1
  205. package/dist/pi-ecosystem-goals/index.js.map +0 -1
  206. package/dist/pi-ecosystem-judgment/decision.js.map +0 -1
  207. package/dist/pi-ecosystem-judgment/distillation.js.map +0 -1
  208. package/dist/pi-ecosystem-judgment/human-value-store.js.map +0 -1
  209. package/dist/pi-ecosystem-judgment/index.js.map +0 -1
  210. package/dist/pi-ecosystem-judgment/value-injection.js.map +0 -1
  211. package/dist/pi-ecosystem-mcp/index.js.map +0 -1
  212. package/dist/pi-ecosystem-subagents/index.js.map +0 -1
  213. package/dist/social/ant-colony/AdaptiveHeartbeat.js.map +0 -1
  214. package/dist/social/ant-colony/PheromoneEngine.js.map +0 -1
  215. package/dist/social/ant-colony/types.js.map +0 -1
  216. package/dist/social/channels/ChannelManager.js.map +0 -1
  217. package/dist/social/channels/DiapChannelBridge.js.map +0 -1
  218. package/dist/social/channels/InterestMatcher.js.map +0 -1
  219. package/dist/social/channels/types.js.map +0 -1
  220. package/dist/social/global-shared-context.js.map +0 -1
  221. package/dist/social/heartbeat.js.map +0 -1
  222. package/dist/web/components/p2p/P2PModal.js +0 -188
  223. package/dist/web/components/p2p/p2p-modal.js +0 -657
  224. package/dist/web/components/p2p/p2p-tools.js +0 -248
  225. package/lefthook.yml +0 -33
  226. package/scripts/auto-evolve-loop.ts +0 -481
  227. package/scripts/auto-evolve-oneshot.sh +0 -155
  228. package/scripts/auto-evolve-snapshot.sh +0 -136
  229. package/scripts/build-cli.js +0 -216
  230. package/scripts/build-web.ts +0 -116
  231. package/scripts/detect-schema-changes.sh +0 -48
  232. package/scripts/diff-reviewer.ts +0 -159
  233. package/scripts/postinstall.js +0 -153
  234. package/scripts/validate-system-prompt.ts +0 -142
  235. package/scripts/weekly-report.ts +0 -364
  236. package/src/agents/agent-manifest-protocol.ts +0 -117
  237. package/src/agents/constraint-layer.ts +0 -309
  238. package/src/agents/iroh-secret.ts +0 -32
  239. package/src/agents/p2p-chat-tools.ts +0 -383
  240. package/src/agents/p2p-document-tools.ts +0 -347
  241. package/src/agents/permission-mode.ts +0 -127
  242. package/src/agents/pi-sdk.ts +0 -2895
  243. package/src/agents/pre-tool-validator.ts +0 -213
  244. package/src/agents/protocol.ts +0 -398
  245. package/src/agents/shell-guard.ts +0 -417
  246. package/src/agents/shell-tool.ts +0 -103
  247. package/src/agents/skill-loader.ts +0 -202
  248. package/src/agents/subagent-manager.ts +0 -553
  249. package/src/agents/workflow-engine.ts +0 -332
  250. package/src/agents/workflow-pivot-loop.ts +0 -766
  251. package/src/bollharness/.sanitize-report.json +0 -13
  252. package/src/bollharness/CLAUDE.md +0 -73
  253. package/src/bollharness/LICENSE +0 -21
  254. package/src/bollharness/README.md +0 -143
  255. package/src/bollharness/README.zh-CN.md +0 -131
  256. package/src/bollharness/package.json +0 -20
  257. package/src/bollharness/reference/SOURCE-COMMIT.txt +0 -3
  258. package/src/bollharness/reference/boll-reference/scripts/hooks/.sanitize-report.json +0 -12
  259. package/src/bollharness/reference/boll-reference/scripts/hooks/find-boll-root.sh +0 -27
  260. package/src/bollharness/reference/boll-reference/scripts/hooks/precompact.sh +0 -57
  261. package/src/bollharness/reference/boll-reference/scripts/hooks/stop-evaluator.md +0 -57
  262. package/src/bollharness/schemas/metrics-jsonl-allowlist.json +0 -67
  263. package/src/bollharness/scripts/checks/next_decision_number.sh +0 -48
  264. package/src/bollharness/scripts/ci/count-components.sh +0 -65
  265. package/src/bollharness/scripts/context-fragments/artifact-linkage.md +0 -14
  266. package/src/bollharness/scripts/context-fragments/auth-consumers.md +0 -17
  267. package/src/bollharness/scripts/context-fragments/bridge-constitution.md +0 -13
  268. package/src/bollharness/scripts/context-fragments/catalyst-distributed.md +0 -18
  269. package/src/bollharness/scripts/context-fragments/closure-checklist.md +0 -13
  270. package/src/bollharness/scripts/context-fragments/contract-consumers.md +0 -15
  271. package/src/bollharness/scripts/context-fragments/db-shared-structures.md +0 -15
  272. package/src/bollharness/scripts/context-fragments/fixed-three-layers.md +0 -19
  273. package/src/bollharness/scripts/context-fragments/general-dev-principles.md +0 -11
  274. package/src/bollharness/scripts/context-fragments/issue-first.md +0 -8
  275. package/src/bollharness/scripts/context-fragments/mcp-parity.md +0 -16
  276. package/src/bollharness/scripts/context-fragments/pi-agent-operations.md +0 -108
  277. package/src/bollharness/scripts/context-fragments/protocol-consumers.md +0 -15
  278. package/src/bollharness/scripts/context-fragments/run-events-consumers.md +0 -15
  279. package/src/bollharness/scripts/context-fragments/scene-fidelity.md +0 -13
  280. package/src/bollharness/scripts/context-fragments/truth-source-hierarchy.md +0 -15
  281. package/src/bollharness/scripts/context-fragments/two-language.md +0 -15
  282. package/src/bollharness/scripts/context-fragments/version-sources.md +0 -14
  283. package/src/bollharness/scripts/hooks/find-project-root.sh +0 -47
  284. package/src/bollharness/scripts/hooks/inbox-poll.sh +0 -78
  285. package/src/bollharness/scripts/hooks/precompact.sh +0 -56
  286. package/src/bollharness/scripts/hooks/stop-evaluator.md +0 -83
  287. package/src/bollharness/scripts/sync-from-upstream.sh +0 -281
  288. package/src/bollharness/src/index.ts +0 -5
  289. package/src/bollharness/src/scripts/checks/check_adr_plan_numbering.ts +0 -11
  290. package/src/bollharness/src/scripts/checks/check_api_types.ts +0 -52
  291. package/src/bollharness/src/scripts/checks/check_artifact_link.ts +0 -156
  292. package/src/bollharness/src/scripts/checks/check_bridge_deps.ts +0 -11
  293. package/src/bollharness/src/scripts/checks/check_bugfix_binding.ts +0 -11
  294. package/src/bollharness/src/scripts/checks/check_bugfix_binding_ci.ts +0 -11
  295. package/src/bollharness/src/scripts/checks/check_doc_file_references.ts +0 -11
  296. package/src/bollharness/src/scripts/checks/check_doc_freshness.ts +0 -141
  297. package/src/bollharness/src/scripts/checks/check_doc_links.ts +0 -36
  298. package/src/bollharness/src/scripts/checks/check_file_existence_claims.ts +0 -11
  299. package/src/bollharness/src/scripts/checks/check_fragment_integrity.ts +0 -40
  300. package/src/bollharness/src/scripts/checks/check_hook_installed.ts +0 -70
  301. package/src/bollharness/src/scripts/checks/check_issue_closure.ts +0 -51
  302. package/src/bollharness/src/scripts/checks/check_mcp_parity.ts +0 -11
  303. package/src/bollharness/src/scripts/checks/check_security.ts +0 -54
  304. package/src/bollharness/src/scripts/checks/check_skill_parity.ts +0 -11
  305. package/src/bollharness/src/scripts/checks/check_versions.ts +0 -11
  306. package/src/bollharness/src/scripts/checks/finding.ts +0 -35
  307. package/src/bollharness/src/scripts/checks/next_decision_number.ts +0 -24
  308. package/src/bollharness/src/scripts/checks/regenerate_magic_docs.ts +0 -11
  309. package/src/bollharness/src/scripts/ci/detect_rebaseline_triggers.ts +0 -14
  310. package/src/bollharness/src/scripts/ci/scan_subprocess_cfg.ts +0 -14
  311. package/src/bollharness/src/scripts/ci/scan_verify_artifacts.ts +0 -14
  312. package/src/bollharness/src/scripts/ci/scan_yaml_schema.ts +0 -14
  313. package/src/bollharness/src/scripts/context_router.ts +0 -76
  314. package/src/bollharness/src/scripts/deploy-guard.ts +0 -182
  315. package/src/bollharness/src/scripts/guard-feedback.ts +0 -215
  316. package/src/bollharness/src/scripts/guard_router.ts +0 -194
  317. package/src/bollharness/src/scripts/hooks/_hook_output.js +0 -3
  318. package/src/bollharness/src/scripts/hooks/_hook_output.ts +0 -11
  319. package/src/bollharness/src/scripts/hooks/auto-python3.ts +0 -10
  320. package/src/bollharness/src/scripts/hooks/deploy-progress-on-session-end.ts +0 -10
  321. package/src/bollharness/src/scripts/hooks/failure-analyzer.ts +0 -10
  322. package/src/bollharness/src/scripts/hooks/gate-judgment-inject.ts +0 -111
  323. package/src/bollharness/src/scripts/hooks/gate-transition-judgment.ts +0 -74
  324. package/src/bollharness/src/scripts/hooks/inbox-ack.ts +0 -10
  325. package/src/bollharness/src/scripts/hooks/inbox-inject-on-start.ts +0 -10
  326. package/src/bollharness/src/scripts/hooks/inbox-validate.ts +0 -10
  327. package/src/bollharness/src/scripts/hooks/inbox-write-ledger.ts +0 -10
  328. package/src/bollharness/src/scripts/hooks/initializer-agent.ts +0 -10
  329. package/src/bollharness/src/scripts/hooks/loop-detection.ts +0 -83
  330. package/src/bollharness/src/scripts/hooks/owner-guard.ts +0 -10
  331. package/src/bollharness/src/scripts/hooks/precompact.ts +0 -10
  332. package/src/bollharness/src/scripts/hooks/review-agent-gatekeeper.ts +0 -10
  333. package/src/bollharness/src/scripts/hooks/risk-tracker.ts +0 -121
  334. package/src/bollharness/src/scripts/hooks/sanitize-on-read.ts +0 -10
  335. package/src/bollharness/src/scripts/hooks/session-reflection.ts +0 -12
  336. package/src/bollharness/src/scripts/hooks/session-start-magic-docs.ts +0 -12
  337. package/src/bollharness/src/scripts/hooks/session-start-reset-risk.ts +0 -12
  338. package/src/bollharness/src/scripts/hooks/session-start-toolkit-reminder.ts +0 -12
  339. package/src/bollharness/src/scripts/hooks/stop-evaluator.ts +0 -164
  340. package/src/bollharness/src/scripts/hooks/tool-call-counter.ts +0 -10
  341. package/src/bollharness/src/scripts/hooks/trace-analyzer.ts +0 -14
  342. package/src/bollharness/src/scripts/install/install-trust-token.ts +0 -13
  343. package/src/bollharness/src/scripts/install/multi_project_registry.ts +0 -13
  344. package/src/bollharness/src/scripts/install/phase2_auto.ts +0 -28
  345. package/src/bollharness/src/scripts/install/pre_commit_installer.ts +0 -10
  346. package/src/bollharness/src/scripts/install/tier_selector.ts +0 -10
  347. package/src/bollharness/src/scripts/install/transcript_miner.ts +0 -13
  348. package/src/bollharness/src/scripts/lib/claim_patterns.ts +0 -11
  349. package/src/bollharness/src/scripts/lib/sanitize_patterns.ts +0 -13
  350. package/src/bollharness/src/scripts/sanitize.ts +0 -9
  351. package/src/bollharness/templates/persona/default.json +0 -19
  352. package/src/bollharness/templates/scaffold/.gitignore.append +0 -16
  353. package/src/bollharness/templates/scaffold/CLAUDE.md +0 -89
  354. package/src/bollharness-integration/channel-judgment-engine.ts +0 -634
  355. package/src/bollharness-integration/context-chain-router.ts +0 -474
  356. package/src/bollharness-integration/context-router-judgment.ts +0 -339
  357. package/src/bollharness-integration/context-router.ts +0 -583
  358. package/src/bollharness-integration/gate-state-machine.ts +0 -444
  359. package/src/bollharness-integration/gate-transition-hooks.ts +0 -137
  360. package/src/bollharness-integration/guard-checker.ts +0 -451
  361. package/src/bollharness-integration/index.ts +0 -195
  362. package/src/bollharness-integration/integration.ts +0 -538
  363. package/src/bollharness-integration/judgment-prompts.yaml +0 -535
  364. package/src/bollharness-integration/llm-judgment-engine.ts +0 -712
  365. package/src/bollharness-integration/skill-adapter.ts +0 -646
  366. package/src/bootstrap/bootstrap.ts +0 -135
  367. package/src/bootstrap/context-collector.ts +0 -371
  368. package/src/bootstrap/context-hierarchy.ts +0 -283
  369. package/src/bootstrap/lifecycle-hooks.ts +0 -289
  370. package/src/bootstrap/project-context.ts +0 -171
  371. package/src/cli/interface.ts +0 -211
  372. package/src/cli-entry.ts +0 -304
  373. package/src/constraints/index.ts +0 -6
  374. package/src/context-compaction/auto-compact.ts +0 -153
  375. package/src/context-compaction/budget-gate.ts +0 -32
  376. package/src/context-compaction/budget-reduce.ts +0 -37
  377. package/src/context-compaction/context-collapse.ts +0 -72
  378. package/src/context-compaction/index.ts +0 -24
  379. package/src/context-compaction/microcompact.ts +0 -54
  380. package/src/context-compaction/pipeline.ts +0 -133
  381. package/src/context-compaction/snip.ts +0 -51
  382. package/src/context-compaction/token-estimator.ts +0 -36
  383. package/src/context-compaction/types.ts +0 -99
  384. package/src/documents/reader.ts +0 -85
  385. package/src/documents/store.ts +0 -252
  386. package/src/electron-preload.ts +0 -25
  387. package/src/electron.ts +0 -200
  388. package/src/heartbeat/DaemonManager.ts +0 -283
  389. package/src/heartbeat/HealthMonitor.ts +0 -317
  390. package/src/heartbeat/StartupVerifier.ts +0 -223
  391. package/src/heartbeat/Watchdog.ts +0 -208
  392. package/src/heartbeat/index.ts +0 -109
  393. package/src/heartbeat/self-improve-bus.ts +0 -110
  394. package/src/heartbeat/types.ts +0 -82
  395. package/src/index.ts +0 -1724
  396. package/src/llm/audio-config-store.ts +0 -246
  397. package/src/llm/config-store.ts +0 -400
  398. package/src/llm/llm-judgment-client.ts +0 -471
  399. package/src/llm/pi-ai.ts +0 -653
  400. package/src/llm/system-prompt/health.ts +0 -159
  401. package/src/llm/system-prompt/layers/channel/local.md +0 -14
  402. package/src/llm/system-prompt/layers/channel/p2p-agent.md +0 -18
  403. package/src/llm/system-prompt/layers/channel/p2p-visitor.md +0 -19
  404. package/src/llm/system-prompt/layers/core/artifacts_storage.md +0 -89
  405. package/src/llm/system-prompt/layers/core/evenhandedness.md +0 -21
  406. package/src/llm/system-prompt/layers/core/hibs_reminders.md +0 -15
  407. package/src/llm/system-prompt/layers/core/identity.md +0 -37
  408. package/src/llm/system-prompt/layers/core/knowledge.md +0 -17
  409. package/src/llm/system-prompt/layers/core/memory_system.md +0 -12
  410. package/src/llm/system-prompt/layers/core/network_filesystem.md +0 -28
  411. package/src/llm/system-prompt/layers/core/refusal.md +0 -37
  412. package/src/llm/system-prompt/layers/core/tone.md +0 -31
  413. package/src/llm/system-prompt/layers/core/tools.thin.md +0 -13
  414. package/src/llm/system-prompt/layers/core/wellbeing.md +0 -41
  415. package/src/llm/system-prompt/layers/role/architect.md +0 -20
  416. package/src/llm/system-prompt/layers/role/expert.md +0 -19
  417. package/src/llm/system-prompt/layers/role/implementer.md +0 -15
  418. package/src/llm/system-prompt/layers/role/security.md +0 -15
  419. package/src/llm/system-prompt/layers/tool/artifacts.md +0 -72
  420. package/src/llm/system-prompt/layers/tool/bash.md +0 -25
  421. package/src/llm/system-prompt/layers/tool/hibs_api.md +0 -171
  422. package/src/llm/system-prompt/layers/tool/image_search.md +0 -70
  423. package/src/llm/system-prompt/layers/tool/manifest.md +0 -89
  424. package/src/llm/system-prompt/layers/tool/mcp_apps.md +0 -53
  425. package/src/llm/system-prompt/layers/tool/web_search.md +0 -83
  426. package/src/llm/system-prompt/registry.ts +0 -325
  427. package/src/llm/system-prompt/strip-hibsml.ts +0 -52
  428. package/src/llm/tool-manifest/ask_user_input.ts +0 -37
  429. package/src/llm/tool-manifest/bash.ts +0 -25
  430. package/src/llm/tool-manifest/create_file.ts +0 -26
  431. package/src/llm/tool-manifest/fetch_sports_data.ts +0 -28
  432. package/src/llm/tool-manifest/image_search.ts +0 -26
  433. package/src/llm/tool-manifest/index.ts +0 -88
  434. package/src/llm/tool-manifest/mcp.ts +0 -46
  435. package/src/llm/tool-manifest/message_compose.ts +0 -33
  436. package/src/llm/tool-manifest/places.ts +0 -86
  437. package/src/llm/tool-manifest/present_files.ts +0 -23
  438. package/src/llm/tool-manifest/recipe.ts +0 -42
  439. package/src/llm/tool-manifest/recommend_apps.ts +0 -25
  440. package/src/llm/tool-manifest/str_replace.ts +0 -29
  441. package/src/llm/tool-manifest/types.ts +0 -52
  442. package/src/llm/tool-manifest/view.ts +0 -26
  443. package/src/llm/tool-manifest/weather.ts +0 -29
  444. package/src/llm/tool-manifest/web.ts +0 -54
  445. package/src/llm/video-config-store.ts +0 -257
  446. package/src/network/agent-network.ts +0 -800
  447. package/src/network/hybrid-messenger.ts +0 -199
  448. package/src/network/iroh-bootstrap.ts +0 -57
  449. package/src/network/iroh-discovery.ts +0 -208
  450. package/src/network/iroh-integration.ts +0 -158
  451. package/src/network/iroh-transport.ts +0 -637
  452. package/src/network/known-peers.ts +0 -102
  453. package/src/network/p2p-direct.ts +0 -262
  454. package/src/network/p2p-secret.ts +0 -153
  455. package/src/network/p2p.ts +0 -964
  456. package/src/network/source-intent-broadcaster.ts +0 -242
  457. package/src/network/source-intent.ts +0 -167
  458. package/src/network/storage/adapters/json-adapter.ts +0 -454
  459. package/src/network/storage/index.ts +0 -203
  460. package/src/network/storage/types.ts +0 -166
  461. package/src/security/builtin-guards.ts +0 -162
  462. package/src/security/context-router-tool.ts +0 -122
  463. package/src/security/input-scanner.ts +0 -287
  464. package/src/security/react-harness.ts +0 -177
  465. package/src/security/tool-gate.ts +0 -294
  466. package/src/social/ant-colony/index.js +0 -19
  467. package/src/social/channels/ChannelManager.ts +0 -485
  468. package/src/social/channels/DiapChannelBridge.ts +0 -501
  469. package/src/social/channels/InterestMatcher.ts +0 -189
  470. package/src/social/channels/agent-workflow-config.json +0 -214
  471. package/src/social/channels/agent-workflow-config.yaml +0 -334
  472. package/src/social/channels/channel-agent-session.ts +0 -407
  473. package/src/social/channels/channel-heartbeat-agent.ts +0 -622
  474. package/src/social/channels/diap-doc-parser.ts +0 -282
  475. package/src/social/channels/harness-workflow-integrator.ts +0 -594
  476. package/src/social/channels/index.ts +0 -22
  477. package/src/social/channels/types.ts +0 -115
  478. package/src/social/global-shared-context.ts +0 -506
  479. package/src/social/heartbeat.ts +0 -1057
  480. package/src/social/persona/enhanced-persona.ts +0 -359
  481. package/src/types.d.ts +0 -12
  482. package/src/utils/auto-evolve-policy.ts +0 -138
  483. package/src/utils/auto-update.ts +0 -482
  484. package/src/utils/clamp.ts +0 -5
  485. package/src/web/agent-delegate-server.ts +0 -148
  486. package/src/web/api-config.html +0 -520
  487. package/src/web/client.js +0 -2352
  488. package/src/web/client.ts +0 -4326
  489. package/src/web/components/p2p/P2PModal.tsx +0 -416
  490. package/src/web/components/p2p/index.ts +0 -566
  491. package/src/web/components/p2p/index.tsx +0 -297
  492. package/src/web/components/p2p/p2p-connection.ts +0 -338
  493. package/src/web/components/p2p/p2p-identity.ts +0 -92
  494. package/src/web/components/p2p/p2p-manager.ts +0 -147
  495. package/src/web/components/p2p/p2p-messages.ts +0 -219
  496. package/src/web/components/p2p/p2p-modal.ts +0 -685
  497. package/src/web/components/p2p/p2p-store-memory.ts +0 -162
  498. package/src/web/components/p2p/p2p-tools.ts +0 -315
  499. package/src/web/components/p2p/types.ts +0 -170
  500. package/src/web/components/wallet-viem.mjs +0 -118
  501. package/src/web/design.md +0 -99
  502. package/src/web/icons/apple-touch-icon.png +0 -0
  503. package/src/web/icons/favicon-16x16.png +0 -0
  504. package/src/web/icons/favicon-192x192.png +0 -0
  505. package/src/web/icons/favicon-32x32.png +0 -0
  506. package/src/web/icons/favicon-48x48.png +0 -0
  507. package/src/web/icons/favicon-512x512.png +0 -0
  508. package/src/web/icons/favicon.icns +0 -0
  509. package/src/web/icons/favicon.ico +0 -0
  510. package/src/web/icons/icon.png +0 -0
  511. package/src/web/icons/image.png +0 -0
  512. package/src/web/index.html +0 -373
  513. package/src/web/iroh-delegate-transport.ts +0 -139
  514. package/src/web/manifest.json +0 -21
  515. package/src/web/server.ts +0 -5731
  516. package/src/web/style.css +0 -4737
  517. package/src/web/ui/message-renderer.ts +0 -540
  518. package/src/web/ui/step-timeline.ts +0 -394
  519. package/staging/auto-evolve/clean-001/.review-verdict +0 -9
  520. package/staging/auto-evolve/clean-001/clean-001.patch +0 -14
  521. package/staging/auto-evolve/e2e-001/.patch-id +0 -1
  522. package/staging/auto-evolve/e2e-001/.review-verdict +0 -12
  523. package/staging/auto-evolve/e2e-001/e2e-001.patch +0 -11
  524. package/staging/auto-evolve/test-bad/.review-verdict +0 -12
  525. package/staging/auto-evolve/test-bad/test-bad.patch +0 -11
  526. package/test-results/.last-run.json +0 -6
  527. package/test-results/src-test-web-loop-status-b-5734c-atus-bar-/346/230/276/347/244/272-spinner-/344/270/215/346/230/276/347/244/272/345/276/252/347/216/257/350/256/241/346/225/260/error-context.md +0 -285
  528. package/tsconfig.cli.json +0 -16
  529. package/tsconfig.electron.json +0 -20
  530. package/tsconfig.json +0 -18
package/src/web/style.css DELETED
@@ -1,4737 +0,0 @@
1
- * {
2
- margin: 0;
3
- padding: 0;
4
- box-sizing: border-box;
5
- }
6
-
7
- :root {
8
- --bg: #1a1a18;
9
- --bg-sidebar: #222220;
10
- --bg-main: #1a1a18;
11
- --bg-hover: #2a2a26;
12
- --bg-active: #333330;
13
- --text: #d8d8c8;
14
- --text-secondary: #909088;
15
- --text-muted: #606058;
16
- --accent: #c4d640;
17
- --accent-dark: #8a9430;
18
- --accent-glow: rgba(196, 214, 64, 0.25);
19
- --accent-hover: #d4e650;
20
- --user-bg: linear-gradient(135deg, #c4d640 0%, #a4b630 100%);
21
- --user-text: #1a1a18;
22
- --ai-bg: #222220;
23
- --ai-text: #d8d8c8;
24
- --border: #3a3a36;
25
- --border-light: #4a4a44;
26
- --radius: 12px;
27
- --radius-sm: 8px;
28
- --sidebar-width: 280px;
29
- --sidebar-collapsed: 56px;
30
- --header-height: 64px;
31
- --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
32
-
33
- /* 语义化状态颜色 */
34
- --success: #22c55e;
35
- --success-bg: rgba(34, 197, 94, 0.1);
36
- --error: #ef4444;
37
- --error-bg: rgba(239, 68, 68, 0.1);
38
- --warning: #f59e0b;
39
- --warning-bg: rgba(245, 158, 11, 0.1);
40
- --info: #2196f3;
41
- --info-bg: rgba(33, 150, 243, 0.1);
42
-
43
- /* 二级 / 三级面 (次级背景, 嵌套层) — 补全未定义变量, 此前引用处 fallback 到 unset */
44
- --bg-secondary: #252522;
45
- --bg-tertiary: #2f2f2a;
46
- --text-primary: #e8e8e0;
47
- --font-mono: 'SF Mono', 'Monaco', 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
48
- --accent-light: #e8f060;
49
- }
50
-
51
- [data-theme="light"] {
52
- --bg: #f0f0e8;
53
- --bg-sidebar: #e8e8e0;
54
- --bg-main: #f0f0e8;
55
- --bg-hover: #dcdcd0;
56
- --bg-active: #d0d0c0;
57
- --text: #2a2a20;
58
- --text-secondary: #606058;
59
- --text-muted: #909088;
60
- --accent: #8a9430;
61
- --accent-dark: #6a7420;
62
- --accent-glow: rgba(138, 148, 48, 0.2);
63
- --accent-hover: #a4b630;
64
- --ai-bg: #e8e8e0;
65
- --ai-text: #2a2a20;
66
- --border: #d0d0c0;
67
- --border-light: #c0c0b0;
68
-
69
- /* 二级 / 三级面 — 补全未定义变量 */
70
- --bg-secondary: #f5f5ed;
71
- --bg-tertiary: #fafaf2;
72
- --text-primary: #1a1a18;
73
- --font-mono: 'SF Mono', 'Monaco', 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
74
- --accent-light: #c4d240;
75
- }
76
-
77
- body {
78
- font-family: 'Noto Sans SC', -apple-system, BlinkMacSystemFont, sans-serif;
79
- background: var(--bg);
80
- color: var(--text);
81
- height: 100vh;
82
- overflow: hidden;
83
- }
84
-
85
- .app-container {
86
- display: flex;
87
- width: 100%;
88
- height: 100%;
89
- }
90
-
91
- /* Sidebar */
92
- .sidebar {
93
- width: var(--sidebar-width);
94
- background: var(--bg-sidebar);
95
- border-right: 1px solid var(--border);
96
- display: flex;
97
- flex-direction: column;
98
- flex-shrink: 0;
99
- transition: var(--transition);
100
- transform: translateX(0);
101
- position: relative;
102
- z-index: 100;
103
- }
104
-
105
- .sidebar.collapsed {
106
- transform: translateX(calc(-1 * var(--sidebar-width)));
107
- position: absolute;
108
- height: 100%;
109
- }
110
-
111
- .sidebar-collapsed {
112
- width: var(--sidebar-collapsed);
113
- background: var(--bg-sidebar);
114
- border-right: 1px solid var(--border);
115
- display: flex;
116
- flex-direction: column;
117
- align-items: center;
118
- padding-top: 16px;
119
- gap: 8px;
120
- flex-shrink: 0;
121
- transition: var(--transition);
122
- transform: translateX(0);
123
- position: relative;
124
- z-index: 99;
125
- }
126
-
127
- .sidebar-collapsed.hidden {
128
- transform: translateX(calc(-1 * var(--sidebar-collapsed)));
129
- position: absolute;
130
- height: 100%;
131
- }
132
-
133
- .expand-btn {
134
- width: 40px;
135
- height: 40px;
136
- border-radius: var(--radius-sm);
137
- background: var(--bg-hover);
138
- border: 1px solid var(--border);
139
- color: var(--text-secondary);
140
- cursor: pointer;
141
- display: flex;
142
- align-items: center;
143
- justify-content: center;
144
- transition: var(--transition);
145
- }
146
-
147
- .expand-btn:hover {
148
- background: var(--bg-active);
149
- color: var(--accent);
150
- border-color: var(--accent);
151
- }
152
-
153
- .collapsed-channels {
154
- display: flex;
155
- flex-direction: column;
156
- gap: 8px;
157
- padding: 8px;
158
- overflow-y: auto;
159
- max-height: calc(100vh - 120px);
160
- }
161
-
162
- .collapsed-channel {
163
- width: 40px;
164
- height: 40px;
165
- border-radius: var(--radius-sm);
166
- background: var(--bg-hover);
167
- border: 1px solid var(--border);
168
- display: flex;
169
- align-items: center;
170
- justify-content: center;
171
- font-size: 16px;
172
- cursor: pointer;
173
- transition: var(--transition);
174
- position: relative;
175
- }
176
-
177
- .collapsed-channel:hover {
178
- background: var(--bg-active);
179
- border-color: var(--accent);
180
- }
181
-
182
- .collapsed-channel::after {
183
- content: attr(data-name);
184
- position: absolute;
185
- left: 48px;
186
- background: var(--bg);
187
- border: 1px solid var(--border);
188
- padding: 4px 8px;
189
- border-radius: var(--radius-sm);
190
- font-size: 12px;
191
- white-space: nowrap;
192
- opacity: 0;
193
- pointer-events: none;
194
- transition: var(--transition);
195
- }
196
-
197
- .collapsed-channel:hover::after {
198
- opacity: 1;
199
- }
200
-
201
- .collapsed-channel.active {
202
- background: var(--accent);
203
- border-color: var(--accent);
204
- }
205
-
206
- /* Sidebar Header */
207
- .sidebar-header {
208
- padding: 16px;
209
- border-bottom: 1px solid var(--border);
210
- display: flex;
211
- align-items: center;
212
- gap: 12px;
213
- }
214
-
215
- .sidebar-toggle {
216
- width: 32px;
217
- height: 32px;
218
- border-radius: var(--radius-sm);
219
- background: transparent;
220
- border: 1px solid var(--border);
221
- color: var(--text-secondary);
222
- cursor: pointer;
223
- display: flex;
224
- align-items: center;
225
- justify-content: center;
226
- transition: var(--transition);
227
- }
228
-
229
- .sidebar-toggle:hover {
230
- background: var(--bg-hover);
231
- color: var(--text);
232
- border-color: var(--border-light);
233
- }
234
-
235
- .sidebar-brand {
236
- display: flex;
237
- align-items: center;
238
- gap: 8px;
239
- flex: 1;
240
- }
241
-
242
- .brand-icon {
243
- font-size: 24px;
244
- color: var(--accent);
245
- filter: drop-shadow(0 0 4px var(--accent-glow));
246
- }
247
-
248
- .brand-text {
249
- font-family: 'JetBrains Mono', monospace;
250
- font-size: 16px;
251
- font-weight: 600;
252
- color: var(--accent);
253
- text-shadow: 0 0 8px var(--accent-glow);
254
- }
255
-
256
- .sidebar-action {
257
- width: 32px;
258
- height: 32px;
259
- border-radius: var(--radius-sm);
260
- background: transparent;
261
- border: 1px solid var(--border);
262
- color: var(--text-secondary);
263
- cursor: pointer;
264
- display: flex;
265
- align-items: center;
266
- justify-content: center;
267
- transition: var(--transition);
268
- }
269
-
270
- .sidebar-action:hover {
271
- background: var(--bg-hover);
272
- color: var(--accent);
273
- border-color: var(--accent);
274
- }
275
-
276
- /* Sidebar Section */
277
- .sidebar-section {
278
- flex: 1 1 0;
279
- min-height: 0; /* 关键: flex 子项 min-height 默认 auto, 会撑破 overflow */
280
- display: flex;
281
- flex-direction: column;
282
- overflow: hidden;
283
- padding: 16px;
284
- position: relative;
285
- }
286
-
287
- /* v3: 本地/远端 flex 比例由 CSS variable 驱动, 拖拽分隔线时改这两个值 */
288
- .sidebar-section.local-flex { flex: var(--local-flex, 1) 1 0; }
289
- .sidebar-section.remote-flex { flex: var(--remote-flex, 1) 1 0; transition: flex 0.15s; }
290
-
291
- /* v3: 可拖拽分隔线 */
292
- #sidebar-split-handle {
293
- flex: 0 0 auto;
294
- height: 6px;
295
- cursor: ns-resize;
296
- display: flex;
297
- align-items: center;
298
- justify-content: center;
299
- position: relative;
300
- background: transparent;
301
- user-select: none;
302
- }
303
- #sidebar-split-handle:hover { background: var(--bg-hover); }
304
- #sidebar-split-handle.dragging { background: var(--accent-glow); }
305
- #sidebar-split-handle .split-handle-grip {
306
- width: 32px;
307
- height: 3px;
308
- border-radius: 2px;
309
- background: var(--border-light);
310
- pointer-events: none;
311
- }
312
- #sidebar-split-handle:hover .split-handle-grip,
313
- #sidebar-split-handle.dragging .split-handle-grip { background: var(--accent); }
314
-
315
- /* v3: 远端区域折叠状态 */
316
- #remote-agents-section.collapsed .channel-list { display: none; }
317
- #remote-agents-section.collapsed { flex: 0 0 auto; padding-top: 0; padding-bottom: 0; }
318
- #remote-agents-section.collapsed .section-header { margin-bottom: 0; }
319
- #remote-agents-section.collapsed #remote-agents-toggle { transform: rotate(-90deg); }
320
-
321
- .section-header {
322
- display: flex;
323
- align-items: center;
324
- justify-content: space-between;
325
- margin-bottom: 12px;
326
- /* sticky 头部: 长列表滚动时, 智能体标题始终可见, 防止用户失去方向感 */
327
- position: sticky;
328
- top: 0;
329
- z-index: 2;
330
- padding-bottom: 6px;
331
- /* 用伪元素做模糊底色, 让滚动的内容在它下面淡出而不是硬切 */
332
- }
333
-
334
- .section-header::after {
335
- content: '';
336
- position: absolute;
337
- left: -16px;
338
- right: -16px;
339
- bottom: -6px;
340
- height: 18px;
341
- background: linear-gradient(to bottom, var(--bg-sidebar), transparent);
342
- pointer-events: none;
343
- z-index: -1;
344
- }
345
-
346
- .section-title {
347
- font-size: 11px;
348
- font-weight: 600;
349
- text-transform: uppercase;
350
- letter-spacing: 0.5px;
351
- color: var(--text-muted);
352
- }
353
-
354
- .section-header {
355
- margin-bottom: 8px;
356
- }
357
-
358
- .section-action {
359
- width: 100%;
360
- height: 36px;
361
- border-radius: 10px;
362
- background: var(--accent);
363
- border: none;
364
- color: var(--bg);
365
- cursor: pointer;
366
- display: flex;
367
- align-items: center;
368
- justify-content: center;
369
- gap: 8px;
370
- font-size: 13px;
371
- font-weight: 600;
372
- font-family: inherit;
373
- letter-spacing: 0.5px;
374
- transition: var(--transition);
375
- box-shadow: 0 2px 8px var(--accent-glow);
376
- }
377
-
378
- .section-action svg {
379
- width: 16px;
380
- height: 16px;
381
- }
382
-
383
- .section-action:hover {
384
- background: var(--accent-hover);
385
- box-shadow: 0 4px 16px var(--accent-glow);
386
- transform: translateY(-1px);
387
- }
388
-
389
- .section-action:active {
390
- transform: translateY(0);
391
- box-shadow: 0 1px 4px var(--accent-glow);
392
- }
393
-
394
- /* New Channel Form */
395
- .new-channel-form {
396
- margin-bottom: 12px;
397
- margin-top: 12px;
398
- }
399
-
400
- .new-channel-form input {
401
- width: 100%;
402
- padding: 10px 12px;
403
- background: var(--bg);
404
- border: 1px solid var(--border);
405
- border-radius: var(--radius-sm);
406
- color: var(--text);
407
- font-size: 14px;
408
- outline: none;
409
- transition: var(--transition);
410
- }
411
-
412
- .new-channel-form input:focus {
413
- border-color: var(--accent);
414
- box-shadow: 0 0 0 3px var(--accent-glow);
415
- }
416
-
417
- .new-channel-form input::placeholder {
418
- color: var(--text-muted);
419
- }
420
-
421
- /* Channel List */
422
- .channel-list {
423
- list-style: none;
424
- flex: 1;
425
- overflow-y: auto;
426
- overflow-x: hidden;
427
- /* 流畅的上下滑动: iOS 弹性滚动 + 桌面惯性滚动 + 边界不外溢 */
428
- -webkit-overflow-scrolling: touch;
429
- overscroll-behavior: contain;
430
- scroll-behavior: smooth;
431
- /* contain 让长列表滚动时不影响外层布局, 减少 reflow */
432
- contain: strict;
433
- /* 重要: gap 在 overflow 容器里会触发滚动跳帧, 用 margin 替代 */
434
- display: block;
435
- padding: 0;
436
- margin: 0;
437
- }
438
-
439
- .channel-list > .agent-group + .agent-group {
440
- margin-top: 4px;
441
- }
442
-
443
- .channel-list::-webkit-scrollbar {
444
- width: 6px;
445
- }
446
-
447
- .channel-list::-webkit-scrollbar-track {
448
- background: transparent;
449
- }
450
-
451
- .channel-list::-webkit-scrollbar-thumb {
452
- background: var(--border);
453
- border-radius: 3px;
454
- /* 滚动条 hover 才出现, 默认隐藏, 减少视觉干扰 */
455
- opacity: 0;
456
- transition: opacity 0.15s ease;
457
- }
458
-
459
- .channel-list:hover::-webkit-scrollbar-thumb,
460
- .channel-list:focus-within::-webkit-scrollbar-thumb,
461
- .channel-list.is-scrolling::-webkit-scrollbar-thumb {
462
- opacity: 1;
463
- }
464
-
465
- .channel-item {
466
- display: flex;
467
- align-items: center;
468
- padding: 10px 12px;
469
- border-radius: var(--radius-sm);
470
- cursor: pointer;
471
- transition: var(--transition);
472
- gap: 10px;
473
- }
474
-
475
- .channel-item:hover {
476
- background: var(--bg-hover);
477
- }
478
-
479
- .channel-item.active {
480
- background: var(--bg-active);
481
- border: 1px solid var(--border-light);
482
- }
483
-
484
- .channel-item.active .channel-name {
485
- color: var(--accent);
486
- font-weight: 500;
487
- }
488
-
489
- /* 2026-06-16: P2P 远端 header 紧凑变体 + mini 按钮 (替代 HTML L66-74 内联) */
490
- .section-header.is-compact {
491
- margin-bottom: 8px;
492
- padding-bottom: 0;
493
- position: static;
494
- }
495
- .section-header.is-compact::after {
496
- display: none;
497
- }
498
- .section-header.is-clickable {
499
- cursor: pointer;
500
- user-select: none;
501
- transition: background 0.15s;
502
- }
503
- .section-header.is-clickable:hover {
504
- background: var(--bg-hover);
505
- }
506
- .section-header-row {
507
- display: flex;
508
- align-items: center;
509
- gap: 6px;
510
- }
511
- .section-header-row .section-title {
512
- font-size: 11px;
513
- font-weight: 600;
514
- text-transform: uppercase;
515
- letter-spacing: 0.5px;
516
- color: var(--text-muted);
517
- }
518
- .section-header-actions {
519
- display: flex;
520
- gap: 4px;
521
- }
522
- .sidebar-mini-btn {
523
- background: transparent;
524
- border: 1px solid var(--border);
525
- color: var(--text-secondary);
526
- cursor: pointer;
527
- padding: 2px 6px;
528
- border-radius: 4px;
529
- font-size: 11px;
530
- line-height: 1;
531
- transition: var(--transition);
532
- }
533
- .sidebar-mini-btn:hover {
534
- background: var(--bg-hover);
535
- color: var(--text-primary);
536
- border-color: var(--border-light);
537
- }
538
- .sidebar-empty-hint {
539
- color: var(--text-muted);
540
- font-size: 11px;
541
- padding: 8px 4px;
542
- text-align: center;
543
- list-style: none;
544
- }
545
-
546
- .channel-icon {
547
- width: 28px;
548
- height: 28px;
549
- border-radius: 8px;
550
- background: var(--bg);
551
- border: 1px solid var(--border);
552
- display: flex;
553
- align-items: center;
554
- justify-content: center;
555
- font-size: 14px;
556
- flex-shrink: 0;
557
- }
558
-
559
- .channel-item.active .channel-icon {
560
- background: var(--accent);
561
- border-color: var(--accent);
562
- }
563
-
564
- .channel-name {
565
- flex: 1;
566
- font-size: 14px;
567
- color: var(--text);
568
- white-space: nowrap;
569
- overflow: hidden;
570
- text-overflow: ellipsis;
571
- }
572
-
573
- .agent-session-count {
574
- display: inline-flex;
575
- align-items: center;
576
- justify-content: center;
577
- min-width: 18px;
578
- height: 18px;
579
- padding: 0 5px;
580
- margin-left: 4px;
581
- border-radius: 9px;
582
- background: var(--bg);
583
- border: 1px solid var(--border);
584
- color: var(--text-muted);
585
- font-size: 11px;
586
- font-weight: 500;
587
- flex-shrink: 0;
588
- }
589
-
590
- .agent-current-session {
591
- flex: 0 1 auto;
592
- margin-left: 4px;
593
- padding: 0 6px;
594
- font-size: 11px;
595
- color: var(--text-muted);
596
- background: var(--bg);
597
- border: 1px solid var(--border);
598
- border-radius: 9px;
599
- height: 18px;
600
- line-height: 16px;
601
- max-width: 100px;
602
- white-space: nowrap;
603
- overflow: hidden;
604
- text-overflow: ellipsis;
605
- flex-shrink: 1;
606
- }
607
-
608
- .agent-row.active .agent-current-session {
609
- color: var(--accent);
610
- border-color: var(--border-light);
611
- background: var(--bg-hover);
612
- }
613
-
614
- .channel-delete {
615
- width: 24px;
616
- height: 24px;
617
- border-radius: 6px;
618
- background: transparent;
619
- border: none;
620
- color: var(--text-muted);
621
- cursor: pointer;
622
- display: flex;
623
- align-items: center;
624
- justify-content: center;
625
- opacity: 0.45;
626
- transition: var(--transition);
627
- font-size: 16px;
628
- }
629
-
630
- .channel-item:hover .channel-delete,
631
- .agent-row:hover .channel-delete {
632
- opacity: 1;
633
- }
634
-
635
- .channel-delete:hover {
636
- background: var(--error-bg);
637
- color: var(--error);
638
- }
639
-
640
- /* Agent group (formerly channel-item — kept classname for back-compat) */
641
- .agent-group {
642
- display: flex;
643
- flex-direction: column;
644
- border-radius: var(--radius-sm);
645
- overflow: hidden;
646
- }
647
-
648
- .agent-row {
649
- display: flex;
650
- align-items: center;
651
- padding: 10px 12px;
652
- border-radius: var(--radius-sm);
653
- cursor: pointer;
654
- transition: var(--transition);
655
- gap: 10px;
656
- }
657
-
658
- .agent-row:hover {
659
- background: var(--bg-hover);
660
- }
661
-
662
- .agent-row.active {
663
- background: var(--bg-active);
664
- border: 1px solid var(--border-light);
665
- }
666
-
667
- .agent-row.active .channel-name {
668
- color: var(--accent);
669
- font-weight: 500;
670
- }
671
-
672
- .agent-caret {
673
- width: 14px;
674
- height: 14px;
675
- color: var(--text-muted);
676
- transition: transform 0.18s ease;
677
- flex-shrink: 0;
678
- }
679
-
680
- .agent-group.expanded .agent-caret {
681
- transform: rotate(90deg);
682
- }
683
-
684
- /* ⚡ 自动工具徽章 + 当前会话名: 折叠时不显示, 只在展开时可见.
685
- 配置 (钱包/工具) 按钮保留在行上, 用户随时能进 modal. */
686
- .agent-group:not(.expanded) .agent-tools-badge,
687
- .agent-group:not(.expanded) .agent-current-session {
688
- display: none !important;
689
- }
690
-
691
- .agent-new-session {
692
- /* 已废弃: 新建会话按钮迁移到 session 列表顶部, 见 .session-new-item */
693
- display: none;
694
- }
695
-
696
- /* Session list nested under each agent */
697
- .session-list {
698
- list-style: none;
699
- margin: 0 0 4px 0;
700
- padding: 0 0 0 28px;
701
- display: none;
702
- flex-direction: column;
703
- gap: 2px;
704
- }
705
-
706
- .agent-group.expanded .session-list {
707
- display: flex;
708
- }
709
-
710
- .session-item {
711
- display: flex;
712
- align-items: center;
713
- padding: 6px 10px;
714
- border-radius: 5px;
715
- cursor: pointer;
716
- transition: var(--transition);
717
- gap: 8px;
718
- position: relative;
719
- }
720
-
721
- .session-item::before {
722
- content: '';
723
- width: 6px;
724
- height: 6px;
725
- border-radius: 50%;
726
- background: var(--text-muted);
727
- flex-shrink: 0;
728
- transition: var(--transition);
729
- }
730
-
731
- .session-item:hover {
732
- background: var(--bg-hover);
733
- }
734
-
735
- .session-item:hover::before {
736
- background: var(--text-secondary);
737
- }
738
-
739
- .session-item.active {
740
- background: var(--bg-active);
741
- }
742
-
743
- .session-item.active::before {
744
- background: var(--accent);
745
- box-shadow: 0 0 4px var(--accent-glow);
746
- }
747
-
748
- .session-item.active .session-name {
749
- color: var(--accent);
750
- font-weight: 500;
751
- }
752
-
753
- /* "新建会话" 入口, 固定在 session 列表最前面, 始终可见 */
754
- .session-new-item {
755
- display: flex;
756
- align-items: center;
757
- gap: 8px;
758
- padding: 6px 10px;
759
- margin-bottom: 2px;
760
- border-radius: 5px;
761
- cursor: pointer;
762
- font-size: 12px;
763
- color: var(--text-secondary);
764
- background: transparent;
765
- border: 1px dashed var(--border-light);
766
- transition: var(--transition);
767
- user-select: none;
768
- }
769
-
770
- .session-new-item:hover {
771
- background: var(--accent);
772
- color: var(--bg);
773
- border-color: var(--accent);
774
- border-style: solid;
775
- }
776
-
777
- .session-new-item:focus-visible {
778
- outline: 2px solid var(--accent);
779
- outline-offset: 1px;
780
- }
781
-
782
- .session-new-item svg {
783
- width: 12px;
784
- height: 12px;
785
- flex-shrink: 0;
786
- }
787
-
788
- .session-name {
789
- flex: 1;
790
- font-size: 13px;
791
- color: var(--text);
792
- white-space: nowrap;
793
- overflow: hidden;
794
- text-overflow: ellipsis;
795
- }
796
-
797
- .session-delete {
798
- width: 18px;
799
- height: 18px;
800
- border-radius: 4px;
801
- background: transparent;
802
- border: none;
803
- color: var(--text-muted);
804
- cursor: pointer;
805
- display: flex;
806
- align-items: center;
807
- justify-content: center;
808
- opacity: 0;
809
- transition: var(--transition);
810
- font-size: 12px;
811
- line-height: 1;
812
- }
813
-
814
- .session-item:hover .session-delete {
815
- opacity: 1;
816
- }
817
-
818
- .session-delete:hover {
819
- background: var(--error-bg);
820
- color: var(--error);
821
- }
822
-
823
- /* Sidebar Footer */
824
- .sidebar-footer {
825
- padding: 16px;
826
- border-top: 1px solid var(--border);
827
- }
828
-
829
- .agent-status {
830
- display: flex;
831
- align-items: center;
832
- gap: 8px;
833
- font-size: 12px;
834
- color: var(--text-secondary);
835
- }
836
-
837
- .status-dot {
838
- width: 8px;
839
- height: 8px;
840
- border-radius: 50%;
841
- background: var(--accent);
842
- box-shadow: 0 0 6px var(--accent-glow);
843
- animation: pulse 2s infinite;
844
- }
845
-
846
- @keyframes pulse {
847
- 0%, 100% { opacity: 1; }
848
- 50% { opacity: 0.5; }
849
- }
850
-
851
- /* Main */
852
- .main {
853
- flex: 1;
854
- display: flex;
855
- flex-direction: column;
856
- height: 100vh;
857
- overflow: hidden;
858
- background: var(--bg-main);
859
- }
860
-
861
- /* Header */
862
- .header {
863
- height: var(--header-height);
864
- padding: 0 24px;
865
- border-bottom: 1px solid var(--border);
866
- display: flex;
867
- align-items: center;
868
- justify-content: space-between;
869
- flex-shrink: 0;
870
- background: var(--bg-sidebar);
871
- }
872
-
873
- .header-left {
874
- display: flex;
875
- align-items: center;
876
- gap: 16px;
877
- }
878
-
879
- .channel-indicator {
880
- width: 12px;
881
- height: 12px;
882
- border-radius: 50%;
883
- background: var(--accent);
884
- box-shadow: 0 0 12px var(--accent-glow);
885
- }
886
-
887
- .header h1 {
888
- font-family: 'JetBrains Mono', monospace;
889
- font-size: 18px;
890
- font-weight: 600;
891
- color: var(--text);
892
- }
893
-
894
- .header-right {
895
- display: flex;
896
- align-items: center;
897
- gap: 12px;
898
- }
899
-
900
- .theme-toggle {
901
- width: 40px;
902
- height: 40px;
903
- border-radius: var(--radius-sm);
904
- background: var(--bg);
905
- border: 1px solid var(--border);
906
- color: var(--text-secondary);
907
- cursor: pointer;
908
- display: flex;
909
- align-items: center;
910
- justify-content: center;
911
- transition: var(--transition);
912
- }
913
-
914
- .header-action {
915
- width: 40px;
916
- height: 40px;
917
- border-radius: var(--radius-sm);
918
- background: var(--bg);
919
- border: 1px solid var(--border);
920
- color: var(--text-secondary);
921
- cursor: pointer;
922
- display: flex;
923
- align-items: center;
924
- justify-content: center;
925
- transition: var(--transition);
926
- }
927
-
928
- .header-action:hover {
929
- background: var(--bg-hover);
930
- color: var(--accent);
931
- border-color: var(--accent);
932
- }
933
-
934
- .theme-toggle:hover {
935
- background: var(--bg-hover);
936
- color: var(--accent);
937
- border-color: var(--accent);
938
- }
939
-
940
- [data-theme="dark"] .sun-icon { display: block; }
941
- [data-theme="dark"] .moon-icon { display: none; }
942
- [data-theme="light"] .sun-icon { display: none; }
943
- [data-theme="light"] .moon-icon { display: block; }
944
-
945
- /* Messages */
946
- .messages {
947
- flex: 1;
948
- overflow-y: auto;
949
- padding: 24px;
950
- display: flex;
951
- flex-direction: column;
952
- gap: 20px;
953
- }
954
-
955
- .messages::-webkit-scrollbar {
956
- width: 6px;
957
- }
958
-
959
- .messages::-webkit-scrollbar-track {
960
- background: transparent;
961
- }
962
-
963
- .messages::-webkit-scrollbar-thumb {
964
- background: var(--border);
965
- border-radius: 3px;
966
- }
967
-
968
- /* Channel messages container */
969
- .channel-messages {
970
- display: none;
971
- flex: 1;
972
- overflow-y: auto;
973
- padding: 24px;
974
- flex-direction: column;
975
- gap: 20px;
976
- }
977
-
978
- .channel-messages.active,
979
- .channel-messages:not([style*="display: none"]) {
980
- display: flex;
981
- }
982
-
983
- .message {
984
- display: flex;
985
- flex-direction: column;
986
- max-width: 85%;
987
- animation: messageIn 0.3s ease-out;
988
- }
989
-
990
- @keyframes messageIn {
991
- from {
992
- opacity: 0;
993
- transform: translateY(10px);
994
- }
995
- to {
996
- opacity: 1;
997
- transform: translateY(0);
998
- }
999
- }
1000
-
1001
- .message-user {
1002
- align-self: flex-end;
1003
- }
1004
-
1005
- .message-ai {
1006
- align-self: flex-start;
1007
- }
1008
-
1009
- .bubble {
1010
- padding: 14px 18px;
1011
- border-radius: var(--radius);
1012
- line-height: 1.7;
1013
- /* 2026-06-16: pre-wrap 改为 pre-line — 保留换行, 但折叠 token 间的多余空格.
1014
- pre-wrap 模式下 marked 输出里 "\n\n" 之外的 token 边界空格被原样保留,
1015
- 视觉上字符间隔过大. pre-line 保持段落结构 (换行生效), 不再放大空格.
1016
- 重要: .bubble pre 子元素走 pre-wrap (见 .bubble pre), 代码块缩进不受影响. */
1017
- white-space: pre-line;
1018
- word-break: break-word;
1019
- font-size: 15px;
1020
- }
1021
-
1022
- .bubble-user {
1023
- background: var(--user-bg);
1024
- color: var(--user-text);
1025
- border-bottom-right-radius: 4px;
1026
- box-shadow: 3px 3px 0px var(--accent-dark);
1027
- }
1028
-
1029
- .bubble-ai {
1030
- background: var(--ai-bg);
1031
- color: var(--ai-text);
1032
- border: 1px solid var(--border);
1033
- border-bottom-left-radius: 4px;
1034
- }
1035
-
1036
- /* System / Error 变体 — 2026-06-16 补全, 之前 system/error 走 addMessage 缺样式
1037
- - system: 信息提示感, 左色条
1038
- - error: 错误提示, 红边 */
1039
- .bubble-system {
1040
- background: var(--bg-secondary);
1041
- border-left: 3px solid var(--accent-dark);
1042
- color: var(--text);
1043
- }
1044
- .bubble-error {
1045
- background: #3a2a2a;
1046
- border: 1px solid var(--error);
1047
- border-left: 3px solid var(--error);
1048
- color: #f0d0d0;
1049
- }
1050
-
1051
- .message-header {
1052
- font-family: 'JetBrains Mono', monospace;
1053
- font-size: 12px;
1054
- font-weight: 600;
1055
- color: var(--accent);
1056
- margin-bottom: 8px;
1057
- padding: 0 4px;
1058
- }
1059
-
1060
- .environment-details {
1061
- font-family: 'JetBrains Mono', monospace;
1062
- font-size: 11px;
1063
- color: var(--text-secondary);
1064
- background: var(--bg);
1065
- border: 1px solid var(--border);
1066
- border-radius: var(--radius-sm);
1067
- padding: 8px 12px;
1068
- margin-bottom: 10px;
1069
- white-space: pre-wrap;
1070
- overflow-x: auto;
1071
- }
1072
-
1073
- .env-container {
1074
- margin-bottom: 8px;
1075
- }
1076
-
1077
- .env-toggle {
1078
- font-family: 'JetBrains Mono', monospace;
1079
- font-size: 11px;
1080
- color: var(--text-muted);
1081
- background: var(--bg);
1082
- border: 1px solid var(--border);
1083
- border-radius: var(--radius-sm);
1084
- padding: 4px 10px;
1085
- cursor: pointer;
1086
- display: inline-flex;
1087
- align-items: center;
1088
- gap: 6px;
1089
- margin-bottom: 6px;
1090
- transition: var(--transition);
1091
- }
1092
-
1093
- .env-toggle:hover {
1094
- border-color: var(--accent);
1095
- color: var(--text-secondary);
1096
- }
1097
-
1098
- .env-arrow {
1099
- font-size: 10px;
1100
- transition: transform 0.2s;
1101
- }
1102
-
1103
- .env-container .environment-details {
1104
- margin-bottom: 0;
1105
- }
1106
-
1107
- .env-container .environment-details pre {
1108
- margin: 0;
1109
- white-space: pre-wrap;
1110
- word-break: break-all;
1111
- }
1112
-
1113
- /* Thinking Process (思维链) */
1114
- .think-container {
1115
- margin-bottom: 10px;
1116
- }
1117
-
1118
- .think-toggle {
1119
- font-family: 'JetBrains Mono', monospace;
1120
- font-size: 11px;
1121
- color: var(--text-muted);
1122
- background: var(--bg);
1123
- border: 1px solid var(--border);
1124
- border-radius: var(--radius-sm);
1125
- padding: 4px 10px;
1126
- cursor: pointer;
1127
- display: inline-flex;
1128
- align-items: center;
1129
- gap: 6px;
1130
- margin-bottom: 6px;
1131
- transition: var(--transition);
1132
- }
1133
-
1134
- .think-toggle:hover {
1135
- border-color: var(--accent);
1136
- color: var(--text-secondary);
1137
- }
1138
-
1139
- .think-arrow {
1140
- font-size: 10px;
1141
- transition: transform 0.2s;
1142
- }
1143
-
1144
- .think-content {
1145
- font-family: 'JetBrains Mono', monospace;
1146
- font-size: 11px;
1147
- color: var(--text-secondary);
1148
- background: var(--bg);
1149
- border: 1px solid var(--border);
1150
- border-radius: var(--radius-sm);
1151
- padding: 8px 12px;
1152
- margin-bottom: 10px;
1153
- white-space: pre-wrap;
1154
- overflow-x: auto;
1155
- }
1156
-
1157
- .think-content pre {
1158
- margin: 0;
1159
- white-space: pre-wrap;
1160
- word-break: break-all;
1161
- }
1162
-
1163
- .time {
1164
- font-size: 11px;
1165
- color: var(--text-muted);
1166
- margin-top: 6px;
1167
- padding: 0 4px;
1168
- }
1169
-
1170
- .message-user .time {
1171
- text-align: right;
1172
- }
1173
-
1174
- /* Message Actions (消息操作按钮) */
1175
- .message-actions {
1176
- display: flex;
1177
- gap: 6px;
1178
- margin-top: 8px;
1179
- padding: 0 4px;
1180
- }
1181
-
1182
- .message-user .message-actions {
1183
- justify-content: flex-end;
1184
- }
1185
-
1186
- .action-btn {
1187
- display: inline-flex;
1188
- align-items: center;
1189
- gap: 4px;
1190
- padding: 4px 10px;
1191
- font-size: 11px;
1192
- font-family: 'JetBrains Mono', monospace;
1193
- color: var(--text-muted);
1194
- background: var(--bg);
1195
- border: 1px solid var(--border);
1196
- border-radius: var(--radius-sm);
1197
- cursor: pointer;
1198
- transition: var(--transition);
1199
- }
1200
-
1201
- .action-btn:hover {
1202
- color: var(--accent);
1203
- border-color: var(--accent);
1204
- background: var(--bg-secondary);
1205
- }
1206
-
1207
- .action-btn:disabled {
1208
- opacity: 0.6;
1209
- cursor: not-allowed;
1210
- }
1211
-
1212
- .copy-btn:hover {
1213
- color: var(--success);
1214
- border-color: var(--success);
1215
- }
1216
-
1217
- .regenerate-btn:hover {
1218
- color: var(--info);
1219
- border-color: var(--info);
1220
- }
1221
-
1222
- @keyframes spin {
1223
- from { transform: rotate(0deg); }
1224
- to { transform: rotate(360deg); }
1225
- }
1226
-
1227
- .spin {
1228
- animation: spin 1s linear infinite;
1229
- }
1230
-
1231
- /* Markdown Styles */
1232
- .bubble h1, .bubble h2, .bubble h3, .bubble h4, .bubble h5, .bubble h6 {
1233
- margin-top: 16px;
1234
- margin-bottom: 8px;
1235
- font-weight: 600;
1236
- }
1237
-
1238
- .bubble h1 { font-size: 1.5em; }
1239
- .bubble h2 { font-size: 1.3em; }
1240
- .bubble h3 { font-size: 1.15em; }
1241
-
1242
- .bubble p {
1243
- margin: 8px 0;
1244
- }
1245
-
1246
- .bubble ul, .bubble ol {
1247
- margin: 8px 0;
1248
- padding-left: 24px;
1249
- }
1250
-
1251
- .bubble li {
1252
- margin: 4px 0;
1253
- }
1254
-
1255
- .bubble code {
1256
- font-family: 'JetBrains Mono', monospace;
1257
- font-size: 0.9em;
1258
- background: var(--bg);
1259
- padding: 2px 6px;
1260
- border-radius: 4px;
1261
- }
1262
-
1263
- .bubble pre {
1264
- background: var(--bg);
1265
- border: 1px solid var(--border);
1266
- border-radius: var(--radius-sm);
1267
- padding: 12px;
1268
- margin: 10px 0;
1269
- overflow-x: auto;
1270
- }
1271
-
1272
- .bubble pre code {
1273
- background: none;
1274
- padding: 0;
1275
- }
1276
-
1277
- .bubble blockquote {
1278
- border-left: 3px solid var(--accent);
1279
- margin: 10px 0;
1280
- padding-left: 12px;
1281
- color: var(--text-secondary);
1282
- }
1283
-
1284
- .bubble table {
1285
- border-collapse: collapse;
1286
- margin: 10px 0;
1287
- width: 100%;
1288
- }
1289
-
1290
- .bubble th, .bubble td {
1291
- border: 1px solid var(--border);
1292
- padding: 8px 12px;
1293
- text-align: left;
1294
- }
1295
-
1296
- .bubble th {
1297
- background: var(--bg);
1298
- font-weight: 600;
1299
- }
1300
-
1301
- .bubble a {
1302
- color: var(--accent);
1303
- text-decoration: none;
1304
- }
1305
-
1306
- .bubble a:hover {
1307
- text-decoration: underline;
1308
- }
1309
-
1310
- .bubble img {
1311
- max-width: 100%;
1312
- border-radius: var(--radius-sm);
1313
- }
1314
- /* User Command Display - inside message div */
1315
- .message-user .user-command-display {
1316
- background: linear-gradient(135deg, var(--bg) 0%, var(--bg-tertiary) 100%);
1317
- border-left: 3px solid var(--accent);
1318
- border-radius: var(--radius-sm);
1319
- padding: 10px 14px;
1320
- margin: 0;
1321
- animation: slideIn 0.3s ease;
1322
- }
1323
-
1324
- .message-user .user-command-display .command-prompt {
1325
- display: flex;
1326
- align-items: flex-start;
1327
- gap: 10px;
1328
- }
1329
-
1330
- .message-user .user-command-display .prompt-icon {
1331
- color: var(--accent);
1332
- font-size: 18px;
1333
- font-weight: bold;
1334
- line-height: 1.4;
1335
- }
1336
-
1337
- .message-user .user-command-display .prompt-text {
1338
- font-family: 'JetBrains Mono', monospace;
1339
- font-size: 13px;
1340
- color: var(--text-primary);
1341
- background: var(--bg);
1342
- padding: 6px 10px;
1343
- border-radius: var(--radius-sm);
1344
- border: 1px solid var(--border);
1345
- white-space: pre-wrap;
1346
- word-break: break-word;
1347
- margin: 0;
1348
- }
1349
-
1350
- @keyframes slideIn {
1351
- from { opacity: 0; transform: translateY(-10px); }
1352
- to { opacity: 1; transform: translateY(0); }
1353
- }
1354
-
1355
- /* Typing Indicator */
1356
- .typing {
1357
- display: flex;
1358
- align-items: center;
1359
- gap: 10px;
1360
- padding: 12px 16px;
1361
- }
1362
-
1363
- .typing-spinner {
1364
- width: 18px;
1365
- height: 18px;
1366
- border: 2px solid var(--border);
1367
- border-top-color: var(--accent);
1368
- border-right-color: var(--accent-dark);
1369
- border-radius: 50%;
1370
- animation: spin 0.8s linear infinite;
1371
- }
1372
-
1373
- .typing-text {
1374
- color: var(--text-secondary);
1375
- font-size: 14px;
1376
- }
1377
-
1378
- /* Streaming Indicator */
1379
- .streaming-content {
1380
- display: flex;
1381
- align-items: center;
1382
- gap: 8px;
1383
- }
1384
-
1385
- .streaming-content::before {
1386
- content: '';
1387
- width: 6px;
1388
- height: 6px;
1389
- background: var(--accent);
1390
- border-radius: 50%;
1391
- animation: streamPulse 1s ease-in-out infinite;
1392
- box-shadow: 0 0 8px var(--accent-glow);
1393
- }
1394
-
1395
- @keyframes streamPulse {
1396
- 0%, 100% { opacity: 0.4; transform: scale(0.8); }
1397
- 50% { opacity: 1; transform: scale(1.2); }
1398
- }
1399
-
1400
- /* Agent status bar (sits between .messages and .input-area) */
1401
- .agent-status {
1402
- display: flex;
1403
- align-items: center;
1404
- gap: 10px;
1405
- padding: 10px 24px;
1406
- background: linear-gradient(
1407
- 180deg,
1408
- transparent 0%,
1409
- var(--accent-glow) 100%
1410
- );
1411
- border-top: 1px solid var(--border);
1412
- font-size: 13px;
1413
- color: var(--text-secondary);
1414
- font-family: 'JetBrains Mono', monospace;
1415
- letter-spacing: 0.3px;
1416
- animation: statusFadeIn 0.3s ease-out;
1417
- min-height: 36px;
1418
- }
1419
-
1420
- .agent-status[hidden] {
1421
- display: none;
1422
- }
1423
-
1424
- @keyframes statusFadeIn {
1425
- from { opacity: 0; transform: translateY(4px); }
1426
- to { opacity: 1; transform: translateY(0); }
1427
- }
1428
-
1429
- .agent-status-spinner {
1430
- display: inline-block;
1431
- width: 14px;
1432
- height: 14px;
1433
- border: 2px solid var(--border-light);
1434
- border-top-color: var(--accent);
1435
- border-right-color: var(--accent-hover);
1436
- border-radius: 50%;
1437
- animation: spin 0.9s cubic-bezier(0.4, 0, 0.2, 1) infinite;
1438
- will-change: transform;
1439
- flex-shrink: 0;
1440
- }
1441
-
1442
- .agent-status-icon {
1443
- font-size: 14px;
1444
- flex-shrink: 0;
1445
- /* 默认不显示, 仅在切换为"执行"状态时显示 */
1446
- display: none;
1447
- }
1448
-
1449
- .agent-status[data-mode="executing"] .agent-status-spinner { display: none; }
1450
- .agent-status[data-mode="executing"] .agent-status-icon { display: inline-block; }
1451
- .agent-status[data-mode="executing"] .agent-status-icon { animation: pulseGlow 1.4s ease-in-out infinite; }
1452
-
1453
- .agent-status-text {
1454
- flex: 1;
1455
- background: linear-gradient(
1456
- 90deg,
1457
- var(--text-secondary) 0%,
1458
- var(--accent) 50%,
1459
- var(--text-secondary) 100%
1460
- );
1461
- background-size: 200% 100%;
1462
- -webkit-background-clip: text;
1463
- background-clip: text;
1464
- color: transparent;
1465
- -webkit-text-fill-color: transparent;
1466
- animation: textShimmer 2.4s linear infinite;
1467
- }
1468
-
1469
- @keyframes textShimmer {
1470
- 0% { background-position: 200% 0; }
1471
- 100% { background-position: -200% 0; }
1472
- }
1473
-
1474
- @keyframes pulseGlow {
1475
- 0%, 100% { transform: scale(1); filter: drop-shadow(0 0 2px var(--accent-glow)); }
1476
- 50% { transform: scale(1.15); filter: drop-shadow(0 0 6px var(--accent)); }
1477
- }
1478
-
1479
- @media (prefers-reduced-motion: reduce) {
1480
- .agent-status-spinner,
1481
- .agent-status-text,
1482
- .agent-status-icon,
1483
- .agent-status {
1484
- animation: none;
1485
- }
1486
- .agent-status-text {
1487
- color: var(--text-secondary);
1488
- -webkit-text-fill-color: var(--text-secondary);
1489
- }
1490
- }
1491
-
1492
- /* Input Area */
1493
- .input-area {
1494
- padding: 20px 24px;
1495
- border-top: 1px solid var(--border);
1496
- background: var(--bg-sidebar);
1497
- flex-shrink: 0;
1498
- }
1499
-
1500
- /* 2026-06-16: 循环 status bar — 三态机 (loading / error / done)
1501
- loading: spinner + 描述文本
1502
- error: 🔴 提示 + 「重试」按钮 → POST /api/loop/retry
1503
- done: ✓ 提示 + 「检查」按钮 → GET /api/loop/inspect (弹 modal 看循环产出)
1504
- 不再显示循环计数, 不再显示百分比. */
1505
- .loop-status-bar {
1506
- position: relative;
1507
- display: flex;
1508
- align-items: center;
1509
- gap: 10px;
1510
- padding: 8px 24px;
1511
- background: var(--bg-tertiary);
1512
- border-top: 1px solid var(--border);
1513
- font-size: 12px;
1514
- color: var(--text-secondary);
1515
- flex-shrink: 0;
1516
- transition: opacity 0.2s ease, max-height 0.2s ease, background 0.2s ease;
1517
- max-height: 60px;
1518
- overflow: hidden;
1519
- }
1520
- .loop-status-bar[hidden] {
1521
- display: none !important;
1522
- }
1523
- .loop-status-bar[data-tone="warn"] {
1524
- background: rgba(245, 158, 11, 0.12);
1525
- color: var(--warning, #f59e0b);
1526
- border-top-color: rgba(245, 158, 11, 0.35);
1527
- }
1528
- .loop-status-bar[data-state="error"] {
1529
- background: rgba(239, 68, 68, 0.12);
1530
- color: var(--error, #ef4444);
1531
- border-top-color: rgba(239, 68, 68, 0.35);
1532
- animation: loop-status-shake 0.4s ease-out;
1533
- }
1534
- .loop-status-bar[data-state="retrying"] {
1535
- background: rgba(245, 158, 11, 0.12);
1536
- color: var(--warning, #f59e0b);
1537
- border-top-color: rgba(245, 158, 11, 0.35);
1538
- }
1539
- .loop-status-bar[data-state="done"] {
1540
- background: rgba(34, 197, 94, 0.12);
1541
- color: var(--success, #22c55e);
1542
- border-top-color: rgba(34, 197, 94, 0.35);
1543
- animation: loop-status-fade-in 0.3s ease-out;
1544
- }
1545
- @keyframes loop-status-shake {
1546
- 0%, 100% { transform: translateX(0); }
1547
- 25% { transform: translateX(-3px); }
1548
- 75% { transform: translateX(3px); }
1549
- }
1550
- @keyframes loop-status-fade-in {
1551
- from { opacity: 0; transform: translateY(4px); }
1552
- to { opacity: 1; transform: translateY(0); }
1553
- }
1554
- .loop-status-spinner {
1555
- display: inline-block;
1556
- width: 14px;
1557
- height: 14px;
1558
- border: 2px solid currentColor;
1559
- border-right-color: transparent;
1560
- border-radius: 50%;
1561
- animation: loop-status-spin 0.7s linear infinite;
1562
- flex-shrink: 0;
1563
- opacity: 0.85;
1564
- }
1565
- .loop-status-bar[data-state="done"] .loop-status-spinner {
1566
- animation: none;
1567
- border-right-color: currentColor;
1568
- opacity: 1;
1569
- }
1570
- .loop-status-icon {
1571
- display: none;
1572
- font-size: 14px;
1573
- flex-shrink: 0;
1574
- line-height: 1;
1575
- }
1576
- .loop-status-bar[data-state="done"] .loop-status-icon::before { content: '✓'; }
1577
- .loop-status-bar[data-state="done"] .loop-status-icon {
1578
- display: inline-block;
1579
- }
1580
- .loop-status-retry {
1581
- flex-shrink: 0;
1582
- font-size: 11px;
1583
- font-weight: 600;
1584
- font-variant-numeric: tabular-nums;
1585
- padding: 2px 8px;
1586
- background: rgba(245, 158, 11, 0.2);
1587
- border-radius: 3px;
1588
- letter-spacing: 0.3px;
1589
- }
1590
- @keyframes loop-status-spin {
1591
- to { transform: rotate(360deg); }
1592
- }
1593
- .loop-status-text {
1594
- flex: 1;
1595
- font-weight: 500;
1596
- white-space: nowrap;
1597
- overflow: hidden;
1598
- text-overflow: ellipsis;
1599
- }
1600
- .loop-status-action {
1601
- flex-shrink: 0;
1602
- padding: 4px 12px;
1603
- font-size: 12px;
1604
- font-weight: 600;
1605
- border: 1px solid currentColor;
1606
- border-radius: 4px;
1607
- background: transparent;
1608
- color: inherit;
1609
- cursor: pointer;
1610
- transition: background 0.15s ease, transform 0.1s ease;
1611
- }
1612
- .loop-status-action:hover {
1613
- background: currentColor;
1614
- color: var(--bg);
1615
- }
1616
- .loop-status-action:active {
1617
- transform: scale(0.96);
1618
- }
1619
- .loop-status-action:disabled {
1620
- opacity: 0.5;
1621
- cursor: not-allowed;
1622
- pointer-events: none;
1623
- }
1624
-
1625
- .input-wrapper {
1626
- display: flex;
1627
- gap: 12px;
1628
- max-width: 900px;
1629
- margin: 0 auto;
1630
- }
1631
-
1632
- #input {
1633
- flex: 1;
1634
- padding: 14px 18px;
1635
- background: var(--bg);
1636
- border: 1px solid var(--border);
1637
- border-radius: var(--radius);
1638
- color: var(--text);
1639
- font-size: 15px;
1640
- outline: none;
1641
- transition: var(--transition);
1642
- font-family: inherit;
1643
- }
1644
-
1645
- #input:focus {
1646
- border-color: var(--accent);
1647
- box-shadow: 0 0 0 3px var(--accent-glow);
1648
- }
1649
-
1650
- #input::placeholder {
1651
- color: var(--text-muted);
1652
- }
1653
-
1654
- .send-btn {
1655
- width: 48px;
1656
- height: 48px;
1657
- border-radius: var(--radius);
1658
- background: var(--accent);
1659
- border: none;
1660
- color: white;
1661
- cursor: pointer;
1662
- display: flex;
1663
- align-items: center;
1664
- justify-content: center;
1665
- transition: var(--transition);
1666
- flex-shrink: 0;
1667
- }
1668
-
1669
- .send-btn:hover {
1670
- background: var(--accent-hover);
1671
- transform: scale(1.05);
1672
- }
1673
-
1674
- .send-btn:active {
1675
- transform: scale(0.95);
1676
- }
1677
-
1678
- /* 2026-06-15: 流式期间切到 abort 状态 — 红色边框 + 终止图标 */
1679
- .send-btn[data-state="abort"] {
1680
- background: var(--bg-main);
1681
- border: 1.5px solid var(--warning);
1682
- color: var(--warning);
1683
- }
1684
- .send-btn[data-state="abort"]:hover {
1685
- background: color-mix(in srgb, var(--warning) 12%, var(--bg-main));
1686
- transform: scale(1.05);
1687
- }
1688
- .send-btn[data-state="aborting"] {
1689
- background: var(--bg-main);
1690
- border: 1.5px solid var(--warning);
1691
- color: var(--warning);
1692
- opacity: 0.7;
1693
- cursor: wait;
1694
- }
1695
-
1696
- /* Responsive */
1697
- @media (max-width: 768px) {
1698
- .sidebar {
1699
- position: absolute;
1700
- height: 100%;
1701
- z-index: 200;
1702
- }
1703
-
1704
- .sidebar.collapsed {
1705
- transform: translateX(calc(-1 * var(--sidebar-width)));
1706
- }
1707
-
1708
- .sidebar-collapsed {
1709
- display: none;
1710
- }
1711
-
1712
- .message {
1713
- max-width: 95%;
1714
- }
1715
- }
1716
-
1717
- /* Modal */
1718
- .modal {
1719
- display: none;
1720
- position: fixed;
1721
- top: 0;
1722
- left: 0;
1723
- width: 100%;
1724
- height: 100%;
1725
- background: rgba(0, 0, 0, 0.7);
1726
- z-index: 1000;
1727
- align-items: center;
1728
- justify-content: center;
1729
- }
1730
-
1731
- .modal.active {
1732
- display: flex;
1733
- }
1734
-
1735
- /* 2026-06-16: Judgment Modal tabs (替换 HTML L233-258 内联) */
1736
- .judgment-tab-bar {
1737
- display: flex;
1738
- border-bottom: 1px solid var(--border);
1739
- margin-top: 20px;
1740
- }
1741
- .judgment-tab {
1742
- flex: 1;
1743
- padding: 10px 12px;
1744
- background: transparent;
1745
- border: none;
1746
- border-bottom: 2px solid transparent;
1747
- color: var(--text-secondary);
1748
- font-size: 13px;
1749
- font-weight: 600;
1750
- cursor: pointer;
1751
- transition: var(--transition);
1752
- }
1753
- .judgment-tab:hover {
1754
- background: var(--bg-hover);
1755
- color: var(--text-primary);
1756
- }
1757
- .judgment-tab.active {
1758
- color: var(--accent-hover);
1759
- border-bottom-color: var(--accent-hover);
1760
- }
1761
- .judgment-tab .tab-channel-name {
1762
- font-weight: normal;
1763
- color: var(--text-muted);
1764
- }
1765
- .judgment-status-bar {
1766
- display: flex;
1767
- gap: 6px;
1768
- margin-top: 10px;
1769
- font-size: 12px;
1770
- align-items: center;
1771
- }
1772
- .judgment-status-bar .label {
1773
- color: var(--text-muted);
1774
- }
1775
- .judgment-status-tab {
1776
- background: var(--bg-hover);
1777
- color: var(--text-secondary);
1778
- border: none;
1779
- padding: 3px 10px;
1780
- border-radius: 3px;
1781
- cursor: pointer;
1782
- font-size: 11px;
1783
- transition: var(--transition);
1784
- }
1785
- .judgment-status-tab:hover {
1786
- background: var(--bg-active);
1787
- color: var(--text-primary);
1788
- }
1789
- .judgment-status-tab.active {
1790
- background: var(--accent);
1791
- color: var(--bg);
1792
- }
1793
- .judgment-form-row {
1794
- display: flex;
1795
- gap: 8px;
1796
- align-items: center;
1797
- }
1798
- .judgment-form-row label {
1799
- margin: 0;
1800
- }
1801
- .judgment-form-row label + label {
1802
- margin-left: 16px;
1803
- }
1804
- .judgment-list-header {
1805
- margin-top: 16px;
1806
- font-size: 14px;
1807
- font-weight: 600;
1808
- display: flex;
1809
- align-items: center;
1810
- gap: 12px;
1811
- flex-wrap: wrap;
1812
- }
1813
- .judgment-list-actions {
1814
- display: flex;
1815
- align-items: center;
1816
- gap: 6px;
1817
- margin-left: auto;
1818
- font-size: 12px;
1819
- font-weight: normal;
1820
- }
1821
- .judgment-select-all-label {
1822
- display: flex;
1823
- align-items: center;
1824
- gap: 4px;
1825
- cursor: pointer;
1826
- color: var(--text-muted);
1827
- }
1828
- .judgment-bulk-delete {
1829
- background: transparent;
1830
- border: 1px solid var(--error);
1831
- color: var(--error);
1832
- padding: 1px 8px;
1833
- border-radius: 3px;
1834
- cursor: pointer;
1835
- font-size: 11px;
1836
- opacity: 0.5;
1837
- }
1838
- .judgment-bulk-delete:not(:disabled):hover {
1839
- opacity: 1;
1840
- background: var(--error-bg);
1841
- }
1842
- .judgment-bulk-delete:disabled {
1843
- cursor: not-allowed;
1844
- }
1845
- .judgment-error {
1846
- color: var(--error);
1847
- display: none;
1848
- }
1849
- .judgment-list {
1850
- max-height: 420px;
1851
- overflow-y: auto;
1852
- }
1853
-
1854
- .modal-content {
1855
- background: var(--bg);
1856
- border: 1px solid var(--border);
1857
- border-radius: var(--radius);
1858
- width: 90%;
1859
- max-width: 500px;
1860
- max-height: 80vh;
1861
- overflow: hidden;
1862
- display: flex;
1863
- flex-direction: column;
1864
- }
1865
-
1866
- .modal-content.modal-p2p-wide {
1867
- max-width: 650px;
1868
- }
1869
-
1870
- .modal-header {
1871
- display: flex;
1872
- align-items: center;
1873
- justify-content: space-between;
1874
- padding: 16px 20px;
1875
- border-bottom: 1px solid var(--border);
1876
- }
1877
-
1878
- .modal-header h2 {
1879
- margin: 0;
1880
- font-size: 18px;
1881
- font-weight: 600;
1882
- }
1883
-
1884
- .modal-close {
1885
- background: none;
1886
- border: none;
1887
- font-size: 24px;
1888
- color: var(--text-secondary);
1889
- cursor: pointer;
1890
- padding: 0;
1891
- line-height: 1;
1892
- }
1893
-
1894
- .modal-close:hover {
1895
- color: var(--text);
1896
- }
1897
-
1898
- .modal-body {
1899
- padding: 20px;
1900
- overflow-y: auto;
1901
- flex: 1;
1902
- }
1903
-
1904
- /* P2P Section */
1905
- .p2p-section {
1906
- margin-bottom: 24px;
1907
- }
1908
-
1909
- .p2p-section:last-child {
1910
- margin-bottom: 0;
1911
- }
1912
-
1913
- .p2p-section h3 {
1914
- margin: 0 0 12px 0;
1915
- font-size: 14px;
1916
- color: var(--text-secondary);
1917
- font-weight: 500;
1918
- }
1919
-
1920
- .p2p-identity {
1921
- display: flex;
1922
- align-items: center;
1923
- gap: 8px;
1924
- margin-bottom: 12px;
1925
- }
1926
-
1927
- .p2p-identity-info {
1928
- flex: 1;
1929
- display: flex;
1930
- flex-direction: column;
1931
- gap: 4px;
1932
- }
1933
-
1934
- .p2p-label {
1935
- font-size: 12px;
1936
- color: var(--text-secondary);
1937
- }
1938
-
1939
- .p2p-value {
1940
- font-size: 12px;
1941
- color: var(--text);
1942
- word-break: break-all;
1943
- }
1944
-
1945
- /* Task Queue */
1946
- .task-badge {
1947
- position: absolute;
1948
- top: -4px;
1949
- right: -4px;
1950
- background: var(--accent);
1951
- color: var(--bg);
1952
- font-size: 10px;
1953
- font-weight: 600;
1954
- padding: 2px 6px;
1955
- border-radius: 10px;
1956
- min-width: 18px;
1957
- text-align: center;
1958
- }
1959
-
1960
- .task-toolbar {
1961
- display: flex;
1962
- gap: 12px;
1963
- margin-bottom: 16px;
1964
- }
1965
-
1966
- .task-list {
1967
- display: flex;
1968
- flex-direction: column;
1969
- gap: 12px;
1970
- }
1971
-
1972
- .task-empty {
1973
- text-align: center;
1974
- color: var(--text-secondary);
1975
- padding: 40px 20px;
1976
- }
1977
-
1978
- /* ============================================ */
1979
- /* Wallet Manager */
1980
- /* ============================================ */
1981
- .wallet-list {
1982
- display: flex;
1983
- flex-direction: column;
1984
- gap: 8px;
1985
- max-height: 320px;
1986
- overflow-y: auto;
1987
- -webkit-overflow-scrolling: touch;
1988
- overscroll-behavior: contain;
1989
- contain: strict;
1990
- margin-top: 8px;
1991
- }
1992
-
1993
- .wallet-empty {
1994
- text-align: center;
1995
- color: var(--text-secondary);
1996
- padding: 24px 16px;
1997
- font-size: 13px;
1998
- border: 1px dashed var(--border);
1999
- border-radius: var(--radius);
2000
- }
2001
-
2002
- .wallet-row {
2003
- display: flex;
2004
- align-items: center;
2005
- gap: 10px;
2006
- padding: 10px 12px;
2007
- background: var(--bg-secondary);
2008
- border: 1px solid var(--border);
2009
- border-radius: var(--radius);
2010
- transition: var(--transition);
2011
- }
2012
-
2013
- .wallet-row:hover {
2014
- border-color: var(--accent);
2015
- }
2016
-
2017
- .wallet-row.is-active {
2018
- border-color: var(--accent);
2019
- background: var(--accent-glow);
2020
- }
2021
-
2022
- .wallet-row .wallet-chain {
2023
- font-size: 10px;
2024
- font-weight: 700;
2025
- padding: 2px 6px;
2026
- border-radius: 4px;
2027
- background: var(--bg);
2028
- color: var(--text-muted);
2029
- letter-spacing: 0.5px;
2030
- flex-shrink: 0;
2031
- }
2032
-
2033
- .wallet-row.is-active .wallet-chain {
2034
- background: var(--accent);
2035
- color: var(--bg);
2036
- }
2037
-
2038
- .wallet-row .wallet-info {
2039
- flex: 1;
2040
- min-width: 0;
2041
- display: flex;
2042
- flex-direction: column;
2043
- gap: 2px;
2044
- }
2045
-
2046
- .wallet-row .wallet-agent {
2047
- font-size: 13px;
2048
- font-weight: 500;
2049
- color: var(--text-primary);
2050
- white-space: nowrap;
2051
- overflow: hidden;
2052
- text-overflow: ellipsis;
2053
- }
2054
-
2055
- .wallet-row .wallet-address {
2056
- font-family: var(--font-mono);
2057
- font-size: 11px;
2058
- color: var(--text-muted);
2059
- white-space: nowrap;
2060
- overflow: hidden;
2061
- text-overflow: ellipsis;
2062
- }
2063
-
2064
- .wallet-row .wallet-actions {
2065
- display: flex;
2066
- gap: 4px;
2067
- flex-shrink: 0;
2068
- }
2069
-
2070
- .wallet-row .wallet-mini-btn {
2071
- width: 26px;
2072
- height: 26px;
2073
- border-radius: 6px;
2074
- background: transparent;
2075
- border: 1px solid var(--border);
2076
- color: var(--text-muted);
2077
- cursor: pointer;
2078
- display: inline-flex;
2079
- align-items: center;
2080
- justify-content: center;
2081
- padding: 0;
2082
- transition: var(--transition);
2083
- }
2084
-
2085
- .wallet-row .wallet-mini-btn:hover {
2086
- background: var(--accent);
2087
- color: var(--bg);
2088
- border-color: var(--accent);
2089
- }
2090
-
2091
- .task-item {
2092
- background: var(--bg-secondary);
2093
- border: 1px solid var(--border);
2094
- border-radius: var(--radius-sm);
2095
- padding: 16px;
2096
- cursor: pointer;
2097
- transition: var(--transition);
2098
- }
2099
-
2100
- .task-item:hover {
2101
- border-color: var(--accent);
2102
- }
2103
-
2104
- .task-item.running {
2105
- border-color: var(--accent);
2106
- background: var(--bg-hover);
2107
- }
2108
-
2109
- .task-item.completed {
2110
- opacity: 0.7;
2111
- }
2112
-
2113
- .task-item-header {
2114
- display: flex;
2115
- align-items: center;
2116
- justify-content: space-between;
2117
- margin-bottom: 8px;
2118
- }
2119
-
2120
- .task-item-title {
2121
- font-weight: 500;
2122
- display: flex;
2123
- align-items: center;
2124
- gap: 8px;
2125
- }
2126
-
2127
- .task-item-status {
2128
- font-size: 12px;
2129
- padding: 2px 8px;
2130
- border-radius: 4px;
2131
- background: var(--bg-tertiary);
2132
- color: var(--text-secondary);
2133
- }
2134
-
2135
- .task-item-status.pending { background: var(--bg-active); color: var(--text-secondary); }
2136
- .task-item-status.running { background: var(--accent); color: var(--bg); }
2137
- .task-item-status.completed { background: var(--success); color: var(--bg); }
2138
- .task-item-status.failed { background: var(--error); color: white; }
2139
- .task-item-status.paused { background: var(--warning); color: var(--bg); }
2140
-
2141
- .task-item-progress {
2142
- height: 4px;
2143
- background: var(--bg-tertiary);
2144
- border-radius: 2px;
2145
- overflow: hidden;
2146
- margin: 8px 0;
2147
- }
2148
-
2149
- .task-item-progress-bar {
2150
- height: 100%;
2151
- background: var(--accent);
2152
- transition: width 0.3s;
2153
- }
2154
-
2155
- .task-item-steps {
2156
- margin-top: 8px;
2157
- padding-left: 16px;
2158
- border-left: 2px solid var(--border);
2159
- }
2160
-
2161
- .task-item-step {
2162
- display: flex;
2163
- align-items: center;
2164
- gap: 8px;
2165
- padding: 4px 0;
2166
- font-size: 13px;
2167
- color: var(--text-secondary);
2168
- }
2169
-
2170
- .task-item-step.completed { color: var(--success); }
2171
- .task-item-step.running { color: var(--accent); }
2172
- .task-item-step.failed { color: var(--error); }
2173
-
2174
- .task-item-actions {
2175
- display: flex;
2176
- gap: 8px;
2177
- margin-top: 12px;
2178
- }
2179
-
2180
- .task-item-desc {
2181
- font-size: 13px;
2182
- color: var(--text-secondary);
2183
- margin-bottom: 8px;
2184
- }
2185
-
2186
- .modal-wide .modal-content {
2187
- max-width: 700px;
2188
- }
2189
-
2190
- .form-group textarea {
2191
- width: 100%;
2192
- padding: 10px 12px;
2193
- background: var(--bg-primary);
2194
- border: 1px solid var(--border);
2195
- border-radius: 6px;
2196
- color: var(--text-primary);
2197
- font-size: 14px;
2198
- font-family: inherit;
2199
- resize: vertical;
2200
- }
2201
-
2202
- .form-group textarea:focus {
2203
- outline: none;
2204
- border-color: var(--accent);
2205
- }
2206
-
2207
- .btn-group {
2208
- display: flex;
2209
- gap: 12px;
2210
- margin-top: 16px;
2211
- }
2212
-
2213
- .btn-group .btn {
2214
- flex: 1;
2215
- }
2216
-
2217
- .p2p-value.mono {
2218
- font-family: var(--font-mono);
2219
- }
2220
-
2221
- .btn-small {
2222
- padding: 6px;
2223
- background: var(--bg-hover);
2224
- border: 1px solid var(--border);
2225
- border-radius: var(--radius-sm);
2226
- color: var(--text-secondary);
2227
- cursor: pointer;
2228
- display: flex;
2229
- align-items: center;
2230
- justify-content: center;
2231
- }
2232
-
2233
- .btn-small:hover {
2234
- background: var(--bg-active);
2235
- color: var(--accent);
2236
- border-color: var(--accent);
2237
- }
2238
-
2239
- .btn-primary, .btn-secondary {
2240
- padding: 8px 16px;
2241
- border-radius: var(--radius-sm);
2242
- font-size: 14px;
2243
- cursor: pointer;
2244
- transition: var(--transition);
2245
- white-space: nowrap;
2246
- }
2247
-
2248
- .btn-primary {
2249
- background: var(--accent);
2250
- border: 1px solid var(--accent);
2251
- color: white;
2252
- }
2253
-
2254
- .btn-primary:hover {
2255
- background: var(--accent-hover);
2256
- }
2257
-
2258
- .btn-secondary {
2259
- background: var(--bg-hover);
2260
- border: 1px solid var(--border);
2261
- color: var(--text);
2262
- }
2263
-
2264
- .btn-secondary:hover {
2265
- background: var(--bg-active);
2266
- border-color: var(--accent);
2267
- }
2268
-
2269
- .p2p-connect {
2270
- display: flex;
2271
- gap: 8px;
2272
- }
2273
-
2274
- .p2p-connect input {
2275
- flex: 1;
2276
- padding: 8px 12px;
2277
- background: var(--bg);
2278
- border: 1px solid var(--border);
2279
- border-radius: var(--radius-sm);
2280
- color: var(--text);
2281
- font-size: 14px;
2282
- }
2283
-
2284
- .p2p-connect input:focus {
2285
- outline: none;
2286
- border-color: var(--accent);
2287
- }
2288
-
2289
- .p2p-connect input::placeholder {
2290
- color: var(--text-secondary);
2291
- }
2292
-
2293
- .p2p-peers-list, .p2p-channels-list {
2294
- max-height: 200px;
2295
- overflow-y: auto;
2296
- border: 1px solid var(--border);
2297
- border-radius: var(--radius-sm);
2298
- }
2299
-
2300
- .p2p-empty {
2301
- padding: 20px;
2302
- text-align: center;
2303
- color: var(--text-secondary);
2304
- font-size: 14px;
2305
- }
2306
-
2307
- .p2p-peer-item {
2308
- display: flex;
2309
- align-items: center;
2310
- justify-content: space-between;
2311
- padding: 10px 12px;
2312
- border-bottom: 1px solid var(--border);
2313
- }
2314
-
2315
- .p2p-peer-item:last-child {
2316
- border-bottom: none;
2317
- }
2318
-
2319
- .p2p-peer-info {
2320
- display: flex;
2321
- flex-direction: column;
2322
- gap: 2px;
2323
- }
2324
-
2325
- .p2p-peer-id {
2326
- font-size: 12px;
2327
- font-family: var(--font-mono);
2328
- color: var(--text);
2329
- }
2330
-
2331
- .p2p-peer-status {
2332
- font-size: 11px;
2333
- color: var(--text-secondary);
2334
- }
2335
-
2336
- .p2p-peer-status.online {
2337
- color: var(--success);
2338
- }
2339
-
2340
- .p2p-channel-item {
2341
- display: flex;
2342
- align-items: center;
2343
- gap: 8px;
2344
- padding: 10px 12px;
2345
- border-bottom: 1px solid var(--border);
2346
- cursor: pointer;
2347
- transition: var(--transition);
2348
- }
2349
-
2350
- .p2p-channel-item:last-child {
2351
- border-bottom: none;
2352
- }
2353
-
2354
- .p2p-channel-item:hover {
2355
- background: var(--bg-hover);
2356
- }
2357
-
2358
- .p2p-channel-item.active {
2359
- background: var(--bg-active);
2360
- border-left: 3px solid var(--accent);
2361
- }
2362
-
2363
- .p2p-channel-info {
2364
- flex: 1;
2365
- display: flex;
2366
- flex-direction: column;
2367
- gap: 2px;
2368
- min-width: 0;
2369
- }
2370
-
2371
- .p2p-channel-name {
2372
- font-size: 14px;
2373
- font-weight: 500;
2374
- }
2375
-
2376
- .p2p-channel-did {
2377
- font-size: 10px;
2378
- font-family: var(--font-mono);
2379
- color: var(--text-secondary);
2380
- overflow: hidden;
2381
- text-overflow: ellipsis;
2382
- white-space: nowrap;
2383
- }
2384
-
2385
- .p2p-channel-cid {
2386
- font-size: 9px;
2387
- font-family: var(--font-mono);
2388
- color: var(--accent);
2389
- overflow: hidden;
2390
- text-overflow: ellipsis;
2391
- white-space: nowrap;
2392
- }
2393
-
2394
- .p2p-channel-icon {
2395
- width: 24px;
2396
- height: 24px;
2397
- display: flex;
2398
- align-items: center;
2399
- justify-content: center;
2400
- font-size: 14px;
2401
- }
2402
-
2403
- .p2p-channel-name {
2404
- flex: 1;
2405
- font-size: 14px;
2406
- }
2407
-
2408
- .p2p-channel-action {
2409
- color: var(--text-secondary);
2410
- font-size: 12px;
2411
- }
2412
-
2413
- .p2p-channel-action:hover {
2414
- color: var(--accent);
2415
- }
2416
-
2417
- /* ==================== API Config Page (Simplified) ==================== */
2418
-
2419
- .api-config-page {
2420
- max-width: 800px;
2421
- margin: 0 auto;
2422
- padding: 24px;
2423
- }
2424
-
2425
- .page-header {
2426
- display: flex;
2427
- align-items: center;
2428
- justify-content: space-between;
2429
- margin-bottom: 24px;
2430
- }
2431
-
2432
- .page-title-group {
2433
- display: flex;
2434
- align-items: center;
2435
- gap: 16px;
2436
- }
2437
-
2438
- .page-title-group h1 {
2439
- font-size: 24px;
2440
- font-weight: 600;
2441
- color: var(--text);
2442
- }
2443
-
2444
- .config-count-badge {
2445
- padding: 4px 12px;
2446
- background: var(--accent-glow);
2447
- border: 1px solid var(--accent);
2448
- border-radius: 20px;
2449
- font-size: 12px;
2450
- color: var(--accent);
2451
- }
2452
-
2453
- .back-link {
2454
- display: flex;
2455
- align-items: center;
2456
- gap: 6px;
2457
- color: var(--text-muted);
2458
- text-decoration: none;
2459
- font-size: 14px;
2460
- transition: color 0.2s;
2461
- }
2462
-
2463
- .back-link:hover {
2464
- color: var(--accent);
2465
- }
2466
-
2467
- .provider-grid {
2468
- display: flex;
2469
- flex-direction: column;
2470
- gap: 12px;
2471
- }
2472
-
2473
- /* Provider Card */
2474
- .provider-card {
2475
- background: var(--bg-sidebar);
2476
- border: 1px solid var(--border);
2477
- border-radius: var(--radius);
2478
- padding: 16px;
2479
- cursor: pointer;
2480
- transition: all 0.2s;
2481
- }
2482
-
2483
- .provider-card:hover {
2484
- border-color: var(--accent);
2485
- background: var(--bg-hover);
2486
- }
2487
-
2488
- .provider-card.active {
2489
- border-color: var(--accent);
2490
- background: linear-gradient(135deg, var(--bg-hover) 0%, var(--bg-sidebar) 100%);
2491
- }
2492
-
2493
- .provider-header {
2494
- display: flex;
2495
- align-items: center;
2496
- gap: 12px;
2497
- margin-bottom: 12px;
2498
- }
2499
-
2500
- .provider-icon {
2501
- width: 44px;
2502
- height: 44px;
2503
- border-radius: 10px;
2504
- background: linear-gradient(135deg, var(--accent) 0%, var(--accent-dark) 100%);
2505
- display: flex;
2506
- align-items: center;
2507
- justify-content: center;
2508
- font-size: 20px;
2509
- font-weight: bold;
2510
- color: var(--bg);
2511
- flex-shrink: 0;
2512
- }
2513
-
2514
- .provider-info {
2515
- flex: 1;
2516
- }
2517
-
2518
- .provider-name {
2519
- font-size: 16px;
2520
- font-weight: 600;
2521
- color: var(--text);
2522
- margin-bottom: 4px;
2523
- }
2524
-
2525
- .provider-desc {
2526
- font-size: 12px;
2527
- color: var(--text-muted);
2528
- }
2529
-
2530
- .status-badge {
2531
- display: flex;
2532
- align-items: center;
2533
- gap: 6px;
2534
- padding: 4px 10px;
2535
- border-radius: 20px;
2536
- font-size: 12px;
2537
- font-weight: 500;
2538
- }
2539
-
2540
- .status-badge .status-dot {
2541
- width: 8px;
2542
- height: 8px;
2543
- border-radius: 50%;
2544
- }
2545
-
2546
- .status-accent {
2547
- background: var(--accent-glow);
2548
- color: var(--accent);
2549
- }
2550
-
2551
- .status-accent .status-dot {
2552
- background: var(--accent);
2553
- animation: pulse 2s infinite;
2554
- }
2555
-
2556
- .status-green {
2557
- background: var(--success-bg);
2558
- color: var(--success);
2559
- }
2560
-
2561
- .status-green .status-dot {
2562
- background: var(--success);
2563
- }
2564
-
2565
- .status-yellow {
2566
- background: var(--warning-bg);
2567
- color: var(--warning);
2568
- }
2569
-
2570
- .status-yellow .status-dot {
2571
- background: var(--warning);
2572
- }
2573
-
2574
- .status-muted {
2575
- background: var(--bg-active);
2576
- color: var(--text-muted);
2577
- }
2578
-
2579
- .status-muted .status-dot {
2580
- background: var(--text-muted);
2581
- }
2582
-
2583
- .provider-footer {
2584
- display: flex;
2585
- align-items: center;
2586
- gap: 16px;
2587
- padding-top: 12px;
2588
- border-top: 1px solid var(--border);
2589
- font-size: 13px;
2590
- color: var(--text-secondary);
2591
- }
2592
-
2593
- .config-status {
2594
- display: flex;
2595
- align-items: center;
2596
- gap: 6px;
2597
- }
2598
-
2599
- .status-icon {
2600
- font-size: 14px;
2601
- }
2602
-
2603
- .status-icon.configured {
2604
- color: var(--success);
2605
- }
2606
-
2607
- .status-icon.not-configured {
2608
- color: var(--text-muted);
2609
- }
2610
-
2611
- .model-info {
2612
- color: var(--text-muted);
2613
- }
2614
-
2615
- .arrow-indicator {
2616
- margin-left: auto;
2617
- font-size: 20px;
2618
- color: var(--text-muted);
2619
- }
2620
-
2621
- /* Loading State */
2622
- .loading-state {
2623
- display: flex;
2624
- flex-direction: column;
2625
- align-items: center;
2626
- justify-content: center;
2627
- padding: 80px 20px;
2628
- gap: 16px;
2629
- }
2630
-
2631
- .loading-state p {
2632
- font-size: 16px;
2633
- color: var(--text-secondary);
2634
- }
2635
-
2636
- .loading-hint {
2637
- font-size: 14px !important;
2638
- color: var(--text-muted) !important;
2639
- }
2640
-
2641
- /* Error State */
2642
- .error-state {
2643
- display: flex;
2644
- flex-direction: column;
2645
- align-items: center;
2646
- justify-content: center;
2647
- padding: 80px 20px;
2648
- gap: 16px;
2649
- }
2650
-
2651
- .error-icon {
2652
- font-size: 48px;
2653
- }
2654
-
2655
- .error-message {
2656
- font-size: 14px;
2657
- color: var(--text-muted);
2658
- }
2659
-
2660
- .retry-btn {
2661
- padding: 10px 24px;
2662
- background: var(--accent);
2663
- color: var(--bg);
2664
- border: none;
2665
- border-radius: var(--radius-sm);
2666
- font-size: 14px;
2667
- cursor: pointer;
2668
- transition: opacity 0.2s;
2669
- }
2670
-
2671
- .retry-btn:hover {
2672
- opacity: 0.9;
2673
- }
2674
-
2675
- /* Modal Overlay */
2676
- .modal-overlay {
2677
- position: fixed;
2678
- inset: 0;
2679
- background: rgba(0, 0, 0, 0.7);
2680
- display: flex;
2681
- align-items: center;
2682
- justify-content: center;
2683
- z-index: 1000;
2684
- padding: 20px;
2685
- }
2686
-
2687
- .modal-box {
2688
- background: var(--bg-sidebar);
2689
- border: 1px solid var(--border);
2690
- border-radius: var(--radius);
2691
- width: 100%;
2692
- max-width: 480px;
2693
- max-height: 90vh;
2694
- overflow: hidden;
2695
- display: flex;
2696
- flex-direction: column;
2697
- }
2698
-
2699
- .modal-header {
2700
- display: flex;
2701
- align-items: center;
2702
- justify-content: space-between;
2703
- padding: 20px;
2704
- border-bottom: 1px solid var(--border);
2705
- }
2706
-
2707
- .modal-title-group {
2708
- display: flex;
2709
- align-items: center;
2710
- gap: 12px;
2711
- }
2712
-
2713
- .modal-icon {
2714
- width: 40px;
2715
- height: 40px;
2716
- border-radius: 10px;
2717
- background: linear-gradient(135deg, var(--accent) 0%, var(--accent-dark) 100%);
2718
- display: flex;
2719
- align-items: center;
2720
- justify-content: center;
2721
- font-size: 18px;
2722
- font-weight: bold;
2723
- color: var(--bg);
2724
- }
2725
-
2726
- .modal-header h2 {
2727
- font-size: 18px;
2728
- font-weight: 600;
2729
- color: var(--text);
2730
- margin-bottom: 4px;
2731
- }
2732
-
2733
- .modal-subtitle {
2734
- font-size: 12px;
2735
- color: var(--text-muted);
2736
- }
2737
-
2738
- .modal-close {
2739
- width: 32px;
2740
- height: 32px;
2741
- border-radius: 8px;
2742
- background: var(--bg-active);
2743
- border: 1px solid var(--border);
2744
- color: var(--text-muted);
2745
- font-size: 20px;
2746
- cursor: pointer;
2747
- display: flex;
2748
- align-items: center;
2749
- justify-content: center;
2750
- transition: all 0.2s;
2751
- }
2752
-
2753
- .modal-close:hover {
2754
- background: var(--error-bg);
2755
- border-color: var(--error);
2756
- color: var(--error);
2757
- }
2758
-
2759
- .modal-form {
2760
- padding: 20px;
2761
- overflow-y: auto;
2762
- }
2763
-
2764
- .form-group {
2765
- margin-bottom: 20px;
2766
- }
2767
-
2768
- .form-group label {
2769
- display: flex;
2770
- align-items: center;
2771
- gap: 8px;
2772
- font-size: 14px;
2773
- font-weight: 500;
2774
- color: var(--text-secondary);
2775
- margin-bottom: 8px;
2776
- }
2777
-
2778
- .label-icon {
2779
- font-size: 16px;
2780
- }
2781
-
2782
- .configured-tag {
2783
- margin-left: auto;
2784
- padding: 2px 8px;
2785
- background: var(--success-bg);
2786
- color: var(--success);
2787
- border-radius: 10px;
2788
- font-size: 11px;
2789
- font-weight: normal;
2790
- }
2791
-
2792
- .form-group input {
2793
- width: 100%;
2794
- padding: 12px 14px;
2795
- background: var(--bg);
2796
- border: 1px solid var(--border);
2797
- border-radius: var(--radius-sm);
2798
- color: var(--text);
2799
- font-size: 14px;
2800
- transition: border-color 0.2s;
2801
- }
2802
-
2803
- .form-group input:focus {
2804
- outline: none;
2805
- border-color: var(--accent);
2806
- }
2807
-
2808
- .form-group input::placeholder {
2809
- color: var(--text-muted);
2810
- }
2811
-
2812
- .form-hint {
2813
- font-size: 12px;
2814
- color: var(--text-muted);
2815
- margin-top: 6px;
2816
- }
2817
-
2818
- .form-row {
2819
- display: flex;
2820
- gap: 12px;
2821
- }
2822
-
2823
- .form-row .form-group {
2824
- flex: 1;
2825
- }
2826
-
2827
- .form-group-small {
2828
- max-width: 100px;
2829
- }
2830
-
2831
- .test-btn {
2832
- display: flex;
2833
- align-items: center;
2834
- gap: 8px;
2835
- padding: 10px 16px;
2836
- background: transparent;
2837
- border: 1px solid var(--accent);
2838
- border-radius: var(--radius-sm);
2839
- color: var(--accent);
2840
- font-size: 14px;
2841
- cursor: pointer;
2842
- transition: all 0.2s;
2843
- }
2844
-
2845
- .test-btn:hover:not(:disabled) {
2846
- background: var(--accent-glow);
2847
- }
2848
-
2849
- .test-btn:disabled {
2850
- opacity: 0.6;
2851
- cursor: not-allowed;
2852
- }
2853
-
2854
- .spinner {
2855
- width: 16px;
2856
- height: 16px;
2857
- border: 2px solid var(--border);
2858
- border-top-color: var(--accent);
2859
- border-radius: 50%;
2860
- animation: spin 1s linear infinite;
2861
- }
2862
-
2863
- .test-result {
2864
- margin-top: 12px;
2865
- padding: 12px;
2866
- border-radius: var(--radius-sm);
2867
- font-size: 14px;
2868
- display: flex;
2869
- align-items: center;
2870
- gap: 8px;
2871
- }
2872
-
2873
- .test-success {
2874
- background: var(--success-bg);
2875
- color: var(--success);
2876
- }
2877
-
2878
- .test-error {
2879
- background: var(--error-bg);
2880
- color: var(--error);
2881
- }
2882
-
2883
- .result-icon {
2884
- font-size: 16px;
2885
- }
2886
-
2887
- .form-actions {
2888
- display: flex;
2889
- gap: 12px;
2890
- margin-top: 24px;
2891
- }
2892
-
2893
- .btn-cancel,
2894
- .btn-save {
2895
- flex: 1;
2896
- padding: 12px;
2897
- border-radius: var(--radius-sm);
2898
- font-size: 14px;
2899
- font-weight: 500;
2900
- cursor: pointer;
2901
- transition: all 0.2s;
2902
- }
2903
-
2904
- .btn-cancel {
2905
- background: var(--bg-active);
2906
- border: 1px solid var(--border);
2907
- color: var(--text);
2908
- }
2909
-
2910
- .btn-cancel:hover {
2911
- border-color: var(--text-muted);
2912
- }
2913
-
2914
- .btn-save {
2915
- background: var(--accent);
2916
- border: none;
2917
- color: var(--bg);
2918
- }
2919
-
2920
- .btn-save:hover {
2921
- opacity: 0.9;
2922
- }
2923
- background: var(--bg-sidebar);
2924
- border: 1px solid var(--border);
2925
- border-radius: var(--radius-sm);
2926
- padding: 12px;
2927
- margin-bottom: 12px;
2928
- }
2929
-
2930
- .iroh-status-item {
2931
- display: flex;
2932
- align-items: flex-start;
2933
- gap: 8px;
2934
- padding: 4px 0;
2935
- }
2936
-
2937
- .iroh-status-item .label {
2938
- font-size: 12px;
2939
- color: var(--text-secondary);
2940
- min-width: 70px;
2941
- }
2942
-
2943
- .iroh-status-item .value {
2944
- font-size: 12px;
2945
- color: var(--text);
2946
- word-break: break-all;
2947
- }
2948
-
2949
- .iroh-status-item .value.mono {
2950
- font-family: var(--font-mono);
2951
- }
2952
-
2953
- .status-loading {
2954
- color: var(--warning);
2955
- }
2956
-
2957
- .status-success {
2958
- color: var(--success);
2959
- }
2960
-
2961
- .status-error {
2962
- color: var(--error);
2963
- }
2964
-
2965
- .p2p-hint {
2966
- font-size: 12px;
2967
- color: var(--text-secondary);
2968
- margin-bottom: 12px;
2969
- }
2970
-
2971
- .p2p-identity-box {
2972
- background: var(--bg-sidebar);
2973
- border: 1px solid var(--border);
2974
- border-radius: var(--radius-sm);
2975
- padding: 12px;
2976
- margin-bottom: 12px;
2977
- }
2978
-
2979
- .identity-row {
2980
- display: flex;
2981
- align-items: center;
2982
- gap: 8px;
2983
- padding: 6px 0;
2984
- }
2985
-
2986
- .identity-label {
2987
- font-size: 12px;
2988
- color: var(--text-secondary);
2989
- min-width: 60px;
2990
- }
2991
-
2992
- .identity-value {
2993
- flex: 1;
2994
- font-size: 11px;
2995
- font-family: var(--font-mono);
2996
- color: var(--accent);
2997
- background: var(--bg);
2998
- padding: 4px 8px;
2999
- border-radius: 4px;
3000
- overflow: hidden;
3001
- text-overflow: ellipsis;
3002
- white-space: nowrap;
3003
- }
3004
-
3005
- .copy-btn-small {
3006
- padding: 4px 8px;
3007
- background: var(--bg-hover);
3008
- border: 1px solid var(--border);
3009
- border-radius: 4px;
3010
- color: var(--text-secondary);
3011
- font-size: 11px;
3012
- cursor: pointer;
3013
- transition: var(--transition);
3014
- }
3015
-
3016
- .copy-btn-small:hover {
3017
- background: var(--accent);
3018
- color: var(--bg);
3019
- border-color: var(--accent);
3020
- }
3021
-
3022
- .p2p-connect-form {
3023
- display: flex;
3024
- gap: 8px;
3025
- }
3026
-
3027
- .p2p-connect-form input {
3028
- flex: 1;
3029
- padding: 10px 12px;
3030
- background: var(--bg);
3031
- border: 1px solid var(--border);
3032
- border-radius: var(--radius-sm);
3033
- color: var(--text);
3034
- font-size: 14px;
3035
- font-family: var(--font-mono);
3036
- }
3037
-
3038
- .p2p-connect-form input:focus {
3039
- outline: none;
3040
- border-color: var(--accent);
3041
- }
3042
-
3043
- .p2p-connect-form input::placeholder {
3044
- color: var(--text-secondary);
3045
- font-family: inherit;
3046
- }
3047
-
3048
- .connect-result {
3049
- margin-top: 8px;
3050
- padding: 8px;
3051
- border-radius: var(--radius-sm);
3052
- font-size: 13px;
3053
- }
3054
-
3055
- .connect-result.success {
3056
- background: var(--success-bg);
3057
- color: var(--success);
3058
- }
3059
-
3060
- .connect-result.error {
3061
- background: var(--error-bg);
3062
- color: var(--error);
3063
- }
3064
-
3065
- .peers-list {
3066
- max-height: 180px;
3067
- overflow-y: auto;
3068
- border: 1px solid var(--border);
3069
- border-radius: var(--radius-sm);
3070
- background: var(--bg-sidebar);
3071
- }
3072
-
3073
- .peer-empty {
3074
- padding: 24px;
3075
- text-align: center;
3076
- color: var(--text-secondary);
3077
- font-size: 13px;
3078
- }
3079
-
3080
- .p2p-messages-list {
3081
- max-height: 200px;
3082
- overflow-y: auto;
3083
- border: 1px solid var(--border);
3084
- border-radius: var(--radius-sm);
3085
- background: var(--bg-sidebar);
3086
- }
3087
-
3088
- .msg-empty {
3089
- padding: 24px;
3090
- text-align: center;
3091
- color: var(--text-secondary);
3092
- font-size: 13px;
3093
- }
3094
-
3095
- .p2p-msg-item {
3096
- padding: 10px 12px;
3097
- border-bottom: 1px solid var(--border);
3098
- }
3099
-
3100
- .p2p-msg-item:last-child {
3101
- border-bottom: none;
3102
- }
3103
-
3104
- .p2p-msg-header {
3105
- display: flex;
3106
- align-items: center;
3107
- justify-content: space-between;
3108
- margin-bottom: 4px;
3109
- }
3110
-
3111
- .p2p-msg-from {
3112
- font-size: 11px;
3113
- color: var(--accent);
3114
- font-family: var(--font-mono);
3115
- }
3116
-
3117
- .p2p-msg-time {
3118
- font-size: 10px;
3119
- color: var(--text-muted);
3120
- }
3121
-
3122
- .p2p-msg-content {
3123
- font-size: 12px;
3124
- color: var(--text);
3125
- word-break: break-word;
3126
- }
3127
-
3128
- /* ==================== API Config Page ==================== */
3129
- .api-config-page {
3130
- max-width: 900px;
3131
- margin: 0 auto;
3132
- padding: 24px;
3133
- min-height: 100vh;
3134
- }
3135
-
3136
- /* Standalone api-config page: enable page-level scrolling.
3137
- Default body has overflow:hidden (for app shell with sidebar). */
3138
- body:has(> .api-config-page) {
3139
- height: auto;
3140
- min-height: 100vh;
3141
- overflow-y: auto;
3142
- }
3143
-
3144
- /* Tab switcher */
3145
- .api-tabs {
3146
- display: flex;
3147
- gap: 4px;
3148
- border-bottom: 1px solid var(--border);
3149
- margin-bottom: 24px;
3150
- }
3151
-
3152
- .api-tab {
3153
- display: flex;
3154
- align-items: center;
3155
- gap: 8px;
3156
- padding: 12px 20px;
3157
- background: transparent;
3158
- border: none;
3159
- border-bottom: 2px solid transparent;
3160
- color: var(--text-muted);
3161
- font-size: 14px;
3162
- font-weight: 500;
3163
- cursor: pointer;
3164
- transition: all 0.2s;
3165
- }
3166
-
3167
- .api-tab:hover {
3168
- color: var(--text);
3169
- }
3170
-
3171
- .api-tab.active {
3172
- color: var(--accent);
3173
- border-bottom-color: var(--accent);
3174
- }
3175
-
3176
- .api-tab-icon {
3177
- font-size: 16px;
3178
- }
3179
-
3180
- .api-panel {
3181
- animation: fadeIn 0.2s ease;
3182
- }
3183
-
3184
- @keyframes fadeIn {
3185
- from { opacity: 0; transform: translateY(4px); }
3186
- to { opacity: 1; transform: translateY(0); }
3187
- }
3188
-
3189
- .video-intro {
3190
- background: var(--bg-sidebar);
3191
- border: 1px solid var(--border);
3192
- border-radius: var(--radius);
3193
- padding: 12px 16px;
3194
- margin-bottom: 16px;
3195
- color: var(--text-muted);
3196
- font-size: 13px;
3197
- line-height: 1.6;
3198
- }
3199
-
3200
- .video-intro p {
3201
- margin: 0;
3202
- }
3203
-
3204
- .provider-docs {
3205
- display: inline-block;
3206
- margin-top: 4px;
3207
- font-size: 12px;
3208
- color: var(--accent);
3209
- text-decoration: none;
3210
- opacity: 0.8;
3211
- }
3212
-
3213
- .provider-docs:hover {
3214
- opacity: 1;
3215
- text-decoration: underline;
3216
- }
3217
-
3218
- .loading-state {
3219
- display: flex;
3220
- flex-direction: column;
3221
- align-items: center;
3222
- justify-content: center;
3223
- padding: 48px;
3224
- color: var(--text-secondary);
3225
- gap: 16px;
3226
- }
3227
-
3228
- .loading-spinner {
3229
- width: 32px;
3230
- height: 32px;
3231
- border: 3px solid var(--border);
3232
- border-top-color: var(--accent);
3233
- border-radius: 50%;
3234
- animation: spin 1s linear infinite;
3235
- will-change: transform;
3236
- }
3237
-
3238
- .error-state {
3239
- display: flex;
3240
- flex-direction: column;
3241
- align-items: center;
3242
- padding: 48px;
3243
- color: var(--text-secondary);
3244
- gap: 16px;
3245
- }
3246
-
3247
- .error-icon {
3248
- font-size: 48px;
3249
- }
3250
-
3251
- .error-message {
3252
- font-size: 16px;
3253
- color: var(--text-secondary);
3254
- }
3255
-
3256
- /* API Config Hint on main page */
3257
- .api-config-hint {
3258
- position: fixed;
3259
- top: 80px;
3260
- left: 50%;
3261
- transform: translateX(-50%);
3262
- display: flex;
3263
- align-items: center;
3264
- gap: 12px;
3265
- padding: 12px 20px;
3266
- background: var(--bg-secondary);
3267
- border: 1px solid var(--accent);
3268
- border-radius: var(--radius);
3269
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
3270
- z-index: 1000;
3271
- animation: slideDown 0.3s ease;
3272
- }
3273
-
3274
- @keyframes slideDown {
3275
- from { opacity: 0; transform: translateX(-50%) translateY(-20px); }
3276
- to { opacity: 1; transform: translateX(-50%) translateY(0); }
3277
- }
3278
-
3279
- .hint-icon {
3280
- font-size: 24px;
3281
- }
3282
-
3283
- .hint-text {
3284
- font-size: 14px;
3285
- line-height: 1.5;
3286
- color: var(--text-secondary);
3287
- }
3288
-
3289
- .hint-text strong {
3290
- color: var(--accent);
3291
- }
3292
-
3293
- .hint-btn {
3294
- padding: 8px 16px;
3295
- background: var(--accent);
3296
- color: var(--bg-primary);
3297
- border: none;
3298
- border-radius: 6px;
3299
- font-size: 13px;
3300
- font-weight: 500;
3301
- cursor: pointer;
3302
- transition: opacity 0.2s;
3303
- }
3304
-
3305
- .hint-btn:hover {
3306
- opacity: 0.9;
3307
- }
3308
-
3309
- /* ============================================
3310
- P2P Network Modal Styles
3311
- ============================================ */
3312
-
3313
- /* P2P Tabs */
3314
- .p2p-tabs {
3315
- display: flex;
3316
- gap: 4px;
3317
- margin-bottom: 20px;
3318
- border-bottom: 1px solid var(--border);
3319
- padding-bottom: 8px;
3320
- }
3321
-
3322
- .p2p-tab {
3323
- padding: 8px 16px;
3324
- background: transparent;
3325
- border: none;
3326
- border-radius: var(--radius) var(--radius) 0 0;
3327
- color: var(--text-secondary);
3328
- font-size: 14px;
3329
- cursor: pointer;
3330
- transition: all 0.2s;
3331
- position: relative;
3332
- }
3333
-
3334
- .p2p-tab:hover {
3335
- color: var(--text-primary);
3336
- background: var(--bg-hover);
3337
- }
3338
-
3339
- .p2p-tab.active {
3340
- color: var(--accent);
3341
- background: var(--bg-secondary);
3342
- }
3343
-
3344
- .p2p-tab.active::after {
3345
- content: '';
3346
- position: absolute;
3347
- bottom: -9px;
3348
- left: 0;
3349
- right: 0;
3350
- height: 2px;
3351
- background: var(--accent);
3352
- }
3353
-
3354
- .unread-badge {
3355
- display: inline-flex;
3356
- align-items: center;
3357
- justify-content: center;
3358
- min-width: 18px;
3359
- height: 18px;
3360
- padding: 0 5px;
3361
- background: var(--error);
3362
- color: white;
3363
- border-radius: 9px;
3364
- font-size: 11px;
3365
- font-weight: 600;
3366
- }
3367
-
3368
- /* P2P Tab Content */
3369
- .p2p-tab-content {
3370
- display: none;
3371
- animation: fadeIn 0.2s ease;
3372
- }
3373
-
3374
- .p2p-tab-content.active {
3375
- display: block;
3376
- }
3377
-
3378
- /* P2P Identity Card */
3379
- .p2p-identity-card {
3380
- background: var(--bg-secondary);
3381
- border: 1px solid var(--border);
3382
- border-radius: var(--radius);
3383
- padding: 20px;
3384
- margin-bottom: 16px;
3385
- }
3386
-
3387
- .identity-status {
3388
- display: flex;
3389
- align-items: center;
3390
- gap: 8px;
3391
- margin-bottom: 16px;
3392
- }
3393
-
3394
- .status-indicator {
3395
- width: 10px;
3396
- height: 10px;
3397
- border-radius: 50%;
3398
- background: var(--text-muted);
3399
- }
3400
-
3401
- .status-indicator.online {
3402
- background: var(--success);
3403
- box-shadow: 0 0 8px var(--success);
3404
- }
3405
-
3406
- .status-indicator.connecting {
3407
- background: var(--warning);
3408
- animation: pulse 1s infinite;
3409
- }
3410
-
3411
- .status-indicator.offline {
3412
- background: var(--text-muted);
3413
- }
3414
-
3415
- .identity-info {
3416
- margin-bottom: 16px;
3417
- }
3418
-
3419
- .info-row {
3420
- display: flex;
3421
- align-items: center;
3422
- gap: 8px;
3423
- padding: 8px 0;
3424
- border-bottom: 1px solid var(--border);
3425
- }
3426
-
3427
- .info-row:last-child {
3428
- border-bottom: none;
3429
- }
3430
-
3431
- .info-label {
3432
- min-width: 80px;
3433
- color: var(--text-secondary);
3434
- font-size: 13px;
3435
- }
3436
-
3437
- .info-value {
3438
- flex: 1;
3439
- font-size: 13px;
3440
- word-break: break-all;
3441
- }
3442
-
3443
- .mono {
3444
- font-family: var(--font-mono);
3445
- }
3446
-
3447
- .copy-btn {
3448
- padding: 4px 8px;
3449
- background: var(--bg-hover);
3450
- border: 1px solid var(--border);
3451
- border-radius: 4px;
3452
- cursor: pointer;
3453
- font-size: 12px;
3454
- transition: all 0.2s;
3455
- }
3456
-
3457
- .copy-btn:hover {
3458
- background: var(--accent);
3459
- color: var(--bg-primary);
3460
- }
3461
-
3462
- /* Share Panel */
3463
- .p2p-share-panel {
3464
- background: var(--bg-secondary);
3465
- border: 1px solid var(--border);
3466
- border-radius: var(--radius);
3467
- padding: 16px;
3468
- margin-bottom: 16px;
3469
- }
3470
-
3471
- .p2p-share-panel h4 {
3472
- margin-bottom: 12px;
3473
- color: var(--text-primary);
3474
- }
3475
-
3476
- .share-actions {
3477
- display: flex;
3478
- gap: 8px;
3479
- flex-wrap: wrap;
3480
- }
3481
-
3482
- .share-link-box {
3483
- margin-top: 12px;
3484
- }
3485
-
3486
- .share-link-box input {
3487
- flex: 1;
3488
- padding: 10px 12px;
3489
- background: var(--bg-primary);
3490
- border: 1px solid var(--border);
3491
- border-radius: var(--radius);
3492
- color: var(--text-primary);
3493
- font-family: var(--font-mono);
3494
- font-size: 12px;
3495
- }
3496
-
3497
- .qr-hint {
3498
- margin-top: 12px;
3499
- color: var(--text-secondary);
3500
- font-size: 13px;
3501
- }
3502
-
3503
- /* P2P Connect Section */
3504
- .p2p-connect-section {
3505
- margin-bottom: 20px;
3506
- }
3507
-
3508
- .p2p-connect-form {
3509
- display: flex;
3510
- gap: 8px;
3511
- margin-top: 12px;
3512
- }
3513
-
3514
- .p2p-connect-form input {
3515
- flex: 1;
3516
- padding: 12px 16px;
3517
- background: var(--bg-secondary);
3518
- border: 1px solid var(--border);
3519
- border-radius: var(--radius);
3520
- color: var(--text-primary);
3521
- font-size: 14px;
3522
- }
3523
-
3524
- .p2p-connect-form input:focus {
3525
- outline: none;
3526
- border-color: var(--accent);
3527
- }
3528
-
3529
- .p2p-connect-form .btn-primary {
3530
- padding: 12px 20px;
3531
- white-space: nowrap;
3532
- }
3533
-
3534
- /* Connect Progress */
3535
- .connect-progress {
3536
- margin-top: 16px;
3537
- padding: 16px;
3538
- background: var(--bg-secondary);
3539
- border-radius: var(--radius);
3540
- }
3541
-
3542
- .progress-bar {
3543
- height: 6px;
3544
- background: var(--bg-hover);
3545
- border-radius: 3px;
3546
- overflow: hidden;
3547
- margin-bottom: 8px;
3548
- }
3549
-
3550
- .progress-fill {
3551
- height: 100%;
3552
- background: linear-gradient(90deg, var(--accent), var(--accent-light));
3553
- border-radius: 3px;
3554
- transition: width 0.3s ease;
3555
- width: 0%;
3556
- }
3557
-
3558
- .progress-text {
3559
- color: var(--text-secondary);
3560
- font-size: 13px;
3561
- }
3562
-
3563
- .connect-result {
3564
- margin-top: 12px;
3565
- padding: 12px;
3566
- border-radius: var(--radius);
3567
- font-size: 14px;
3568
- }
3569
-
3570
- .connect-result.success {
3571
- background: rgba(34, 197, 94, 0.1);
3572
- border: 1px solid var(--success);
3573
- color: var(--success);
3574
- }
3575
-
3576
- .connect-result.error {
3577
- background: rgba(239, 68, 68, 0.1);
3578
- border: 1px solid var(--error);
3579
- color: var(--error);
3580
- }
3581
-
3582
- .connect-result.warning {
3583
- background: rgba(234, 179, 8, 0.1);
3584
- border: 1px solid var(--warning);
3585
- color: var(--warning);
3586
- }
3587
-
3588
- /* Quick Connect */
3589
- .p2p-quick-connect {
3590
- margin-top: 24px;
3591
- }
3592
-
3593
- .p2p-quick-connect h4 {
3594
- margin-bottom: 12px;
3595
- color: var(--text-secondary);
3596
- font-size: 13px;
3597
- }
3598
-
3599
- .quick-list {
3600
- display: flex;
3601
- flex-direction: column;
3602
- gap: 8px;
3603
- }
3604
-
3605
- .quick-empty {
3606
- color: var(--text-muted);
3607
- font-size: 13px;
3608
- padding: 16px;
3609
- text-align: center;
3610
- }
3611
-
3612
- .quick-item {
3613
- display: flex;
3614
- align-items: center;
3615
- gap: 12px;
3616
- padding: 12px;
3617
- background: var(--bg-secondary);
3618
- border: 1px solid var(--border);
3619
- border-radius: var(--radius);
3620
- cursor: pointer;
3621
- transition: all 0.2s;
3622
- }
3623
-
3624
- .quick-item:hover {
3625
- border-color: var(--accent);
3626
- background: var(--bg-hover);
3627
- }
3628
-
3629
- .quick-item-icon {
3630
- font-size: 20px;
3631
- }
3632
-
3633
- .quick-item-info {
3634
- flex: 1;
3635
- }
3636
-
3637
- .quick-item-name {
3638
- font-weight: 500;
3639
- margin-bottom: 2px;
3640
- }
3641
-
3642
- .quick-item-meta {
3643
- font-size: 12px;
3644
- color: var(--text-secondary);
3645
- }
3646
-
3647
- .quick-item-status {
3648
- display: flex;
3649
- align-items: center;
3650
- gap: 4px;
3651
- font-size: 12px;
3652
- }
3653
-
3654
- .quick-item-status .dot {
3655
- width: 6px;
3656
- height: 6px;
3657
- border-radius: 50%;
3658
- }
3659
-
3660
- .quick-item-status .dot.online { background: var(--success); }
3661
- .quick-item-status .dot.offline { background: var(--text-muted); }
3662
-
3663
- /* History List */
3664
- .p2p-history-toolbar {
3665
- margin-bottom: 12px;
3666
- }
3667
-
3668
- .history-list {
3669
- display: flex;
3670
- flex-direction: column;
3671
- gap: 8px;
3672
- }
3673
-
3674
- .history-empty {
3675
- color: var(--text-muted);
3676
- font-size: 13px;
3677
- padding: 32px;
3678
- text-align: center;
3679
- }
3680
-
3681
- .history-item {
3682
- display: flex;
3683
- align-items: center;
3684
- gap: 12px;
3685
- padding: 12px;
3686
- background: var(--bg-secondary);
3687
- border: 1px solid var(--border);
3688
- border-radius: var(--radius);
3689
- cursor: pointer;
3690
- transition: all 0.2s;
3691
- }
3692
-
3693
- .history-item:hover {
3694
- border-color: var(--accent);
3695
- }
3696
-
3697
- .history-item.pinned {
3698
- border-left: 3px solid var(--accent);
3699
- }
3700
-
3701
- .history-item-icon {
3702
- font-size: 24px;
3703
- }
3704
-
3705
- .history-item-info {
3706
- flex: 1;
3707
- }
3708
-
3709
- .history-item-name {
3710
- font-weight: 500;
3711
- display: flex;
3712
- align-items: center;
3713
- gap: 6px;
3714
- }
3715
-
3716
- .history-item-name .pin-icon {
3717
- font-size: 12px;
3718
- color: var(--accent);
3719
- }
3720
-
3721
- .history-item-meta {
3722
- font-size: 12px;
3723
- color: var(--text-secondary);
3724
- display: flex;
3725
- gap: 12px;
3726
- }
3727
-
3728
- .history-item-actions {
3729
- display: flex;
3730
- gap: 8px;
3731
- }
3732
-
3733
- .history-item-actions button {
3734
- padding: 6px 12px;
3735
- font-size: 12px;
3736
- }
3737
-
3738
- /* Peers Section */
3739
- .p2p-peers-section {
3740
- margin-top: 24px;
3741
- padding-top: 16px;
3742
- border-top: 1px solid var(--border);
3743
- }
3744
-
3745
- .p2p-peers-section h4 {
3746
- margin-bottom: 12px;
3747
- color: var(--text-secondary);
3748
- font-size: 13px;
3749
- }
3750
-
3751
- .peers-list {
3752
- display: flex;
3753
- flex-direction: column;
3754
- gap: 8px;
3755
- }
3756
-
3757
- .peer-empty {
3758
- color: var(--text-muted);
3759
- font-size: 13px;
3760
- padding: 16px;
3761
- text-align: center;
3762
- }
3763
-
3764
- .peer-item {
3765
- display: flex;
3766
- align-items: center;
3767
- gap: 12px;
3768
- padding: 12px;
3769
- background: var(--bg-secondary);
3770
- border: 1px solid var(--border);
3771
- border-radius: var(--radius);
3772
- }
3773
-
3774
- .peer-status {
3775
- display: flex;
3776
- align-items: center;
3777
- gap: 6px;
3778
- }
3779
-
3780
- .peer-status .dot {
3781
- width: 8px;
3782
- height: 8px;
3783
- border-radius: 50%;
3784
- }
3785
-
3786
- .peer-status .dot.online {
3787
- background: var(--success);
3788
- box-shadow: 0 0 6px var(--success);
3789
- }
3790
-
3791
- .peer-status .dot.offline {
3792
- background: var(--text-muted);
3793
- }
3794
-
3795
- .peer-status .dot.connecting {
3796
- background: var(--warning);
3797
- animation: pulse 1s infinite;
3798
- }
3799
-
3800
- .peer-info {
3801
- flex: 1;
3802
- }
3803
-
3804
- .peer-name {
3805
- font-weight: 500;
3806
- margin-bottom: 2px;
3807
- }
3808
-
3809
- .peer-meta {
3810
- font-size: 12px;
3811
- color: var(--text-secondary);
3812
- }
3813
-
3814
- .peer-actions {
3815
- display: flex;
3816
- gap: 8px;
3817
- }
3818
-
3819
- .peer-actions button {
3820
- padding: 6px 12px;
3821
- font-size: 12px;
3822
- }
3823
-
3824
- /* Messages Section */
3825
- .p2p-messages-toolbar {
3826
- margin-bottom: 12px;
3827
- display: flex;
3828
- justify-content: flex-end;
3829
- }
3830
-
3831
- .messages-list {
3832
- display: flex;
3833
- flex-direction: column;
3834
- gap: 8px;
3835
- max-height: 400px;
3836
- overflow-y: auto;
3837
- }
3838
-
3839
- .messages-empty {
3840
- color: var(--text-muted);
3841
- font-size: 13px;
3842
- padding: 32px;
3843
- text-align: center;
3844
- }
3845
-
3846
- .message-item {
3847
- padding: 12px;
3848
- background: var(--bg-secondary);
3849
- border: 1px solid var(--border);
3850
- border-radius: var(--radius);
3851
- }
3852
-
3853
- .message-header {
3854
- display: flex;
3855
- align-items: center;
3856
- gap: 8px;
3857
- margin-bottom: 8px;
3858
- }
3859
-
3860
- .message-sender {
3861
- font-weight: 500;
3862
- }
3863
-
3864
- .message-time {
3865
- font-size: 12px;
3866
- color: var(--text-secondary);
3867
- }
3868
-
3869
- .message-content {
3870
- font-size: 14px;
3871
- line-height: 1.5;
3872
- }
3873
-
3874
- .message-unread {
3875
- border-left: 3px solid var(--accent);
3876
- }
3877
-
3878
- /* Offline Queue */
3879
- .offline-queue {
3880
- margin-top: 20px;
3881
- padding: 16px;
3882
- background: var(--bg-secondary);
3883
- border: 1px solid var(--warning);
3884
- border-radius: var(--radius);
3885
- }
3886
-
3887
- .offline-queue h4 {
3888
- color: var(--warning);
3889
- margin-bottom: 12px;
3890
- }
3891
-
3892
- .queue-list {
3893
- display: flex;
3894
- flex-direction: column;
3895
- gap: 8px;
3896
- }
3897
-
3898
- .queue-item {
3899
- display: flex;
3900
- align-items: center;
3901
- gap: 12px;
3902
- padding: 10px;
3903
- background: var(--bg-hover);
3904
- border-radius: var(--radius);
3905
- font-size: 13px;
3906
- }
3907
-
3908
- .queue-item-content {
3909
- flex: 1;
3910
- overflow: hidden;
3911
- text-overflow: ellipsis;
3912
- white-space: nowrap;
3913
- }
3914
-
3915
- .queue-item-status {
3916
- display: flex;
3917
- align-items: center;
3918
- gap: 6px;
3919
- }
3920
-
3921
- .queue-item-status .retry-count {
3922
- background: var(--warning);
3923
- color: var(--bg-primary);
3924
- padding: 2px 6px;
3925
- border-radius: 4px;
3926
- font-size: 11px;
3927
- }
3928
-
3929
- .queue-item-status .status-pending {
3930
- color: var(--warning);
3931
- }
3932
-
3933
- .queue-item-status .status-failed {
3934
- color: var(--error);
3935
- }
3936
-
3937
- .queue-retry-btn {
3938
- padding: 4px 8px;
3939
- font-size: 12px;
3940
- background: var(--accent);
3941
- color: var(--bg-primary);
3942
- border: none;
3943
- border-radius: 4px;
3944
- cursor: pointer;
3945
- }
3946
-
3947
- /* Persistent Peers Section */
3948
- .persistent-peers-section {
3949
- margin: 16px 0;
3950
- padding: 12px;
3951
- background: var(--bg-secondary);
3952
- border: 1px solid var(--border);
3953
- border-radius: var(--radius);
3954
- }
3955
-
3956
- .persistent-peers-section h4 {
3957
- margin-bottom: 12px;
3958
- font-size: 14px;
3959
- color: var(--text);
3960
- }
3961
-
3962
- .persistent-peer-item {
3963
- display: flex;
3964
- align-items: center;
3965
- gap: 12px;
3966
- padding: 12px;
3967
- border: 1px solid var(--border);
3968
- border-radius: 8px;
3969
- margin-bottom: 8px;
3970
- background: var(--bg-primary);
3971
- transition: var(--transition);
3972
- }
3973
-
3974
- .persistent-peer-item:last-child {
3975
- margin-bottom: 0;
3976
- }
3977
-
3978
- .persistent-peer-item.connected {
3979
- border-color: var(--success);
3980
- background: rgba(76, 175, 80, 0.05);
3981
- }
3982
-
3983
- .persistent-peer-item.disconnected {
3984
- opacity: 0.8;
3985
- }
3986
-
3987
- .persistent-peer-item.reconnecting {
3988
- border-color: var(--warning);
3989
- animation: pulse 2s infinite;
3990
- }
3991
-
3992
- .peer-status-indicator {
3993
- flex-shrink: 0;
3994
- }
3995
-
3996
- .peer-status-indicator .dot {
3997
- display: block;
3998
- width: 10px;
3999
- height: 10px;
4000
- border-radius: 50%;
4001
- }
4002
-
4003
- .peer-status-indicator .dot.online {
4004
- background: var(--success);
4005
- box-shadow: 0 0 6px var(--success);
4006
- }
4007
-
4008
- .peer-status-indicator .dot.offline {
4009
- background: var(--text-muted);
4010
- }
4011
-
4012
- .auto-badge {
4013
- display: inline-block;
4014
- padding: 2px 6px;
4015
- font-size: 10px;
4016
- background: var(--accent);
4017
- color: var(--bg-primary);
4018
- border-radius: 4px;
4019
- margin-left: 6px;
4020
- }
4021
-
4022
- .peer-info .peer-name {
4023
- display: flex;
4024
- align-items: center;
4025
- font-weight: 500;
4026
- }
4027
-
4028
- .peer-info .peer-meta {
4029
- font-size: 12px;
4030
- color: var(--text-secondary);
4031
- display: flex;
4032
- gap: 12px;
4033
- margin-top: 4px;
4034
- }
4035
-
4036
- .btn-danger {
4037
- background: var(--error);
4038
- color: white;
4039
- }
4040
-
4041
- .btn-danger:hover {
4042
- background: #c62828;
4043
- }
4044
-
4045
- /* Modal Small */
4046
- .modal-sm {
4047
- max-width: 300px !important;
4048
- }
4049
-
4050
- /* Toast */
4051
- .toast {
4052
- position: fixed;
4053
- bottom: 20px;
4054
- left: 50%;
4055
- transform: translateX(-50%);
4056
- padding: 12px 24px;
4057
- background: var(--bg-secondary);
4058
- border: 1px solid var(--accent);
4059
- border-radius: var(--radius);
4060
- color: var(--text-primary);
4061
- font-size: 14px;
4062
- z-index: 9999;
4063
- animation: toastFade 2s ease forwards;
4064
- }
4065
-
4066
- @keyframes toastFade {
4067
- 0% { opacity: 0; transform: translateX(-50%) translateY(20px); }
4068
- 10% { opacity: 1; transform: translateX(-50%) translateY(0); }
4069
- 80% { opacity: 1; }
4070
- 100% { opacity: 0; }
4071
- }
4072
-
4073
- /* ============================================ */
4074
- /* Catalog: section header `+` button, badges */
4075
- /* ============================================ */
4076
-
4077
- .section-header-action {
4078
- width: 22px;
4079
- height: 22px;
4080
- border-radius: 6px;
4081
- background: transparent;
4082
- border: 1px solid var(--border);
4083
- color: var(--text-muted);
4084
- cursor: pointer;
4085
- display: inline-flex;
4086
- align-items: center;
4087
- justify-content: center;
4088
- padding: 0;
4089
- transition: var(--transition);
4090
- }
4091
-
4092
- .section-header-action:hover {
4093
- background: var(--accent);
4094
- color: var(--bg);
4095
- border-color: var(--accent);
4096
- }
4097
-
4098
- .agent-row .agent-wallet-badge {
4099
- display: inline-flex;
4100
- align-items: center;
4101
- justify-content: center;
4102
- font-size: 10px;
4103
- font-weight: 600;
4104
- padding: 1px 5px;
4105
- border-radius: 4px;
4106
- background: var(--accent-glow);
4107
- color: var(--accent);
4108
- border: 1px solid var(--accent);
4109
- letter-spacing: 0.3px;
4110
- margin-left: 4px;
4111
- flex-shrink: 0;
4112
- }
4113
-
4114
- .agent-row .agent-tools-badge {
4115
- display: inline-flex;
4116
- align-items: center;
4117
- justify-content: center;
4118
- font-size: 10px;
4119
- font-weight: 600;
4120
- padding: 1px 5px;
4121
- border-radius: 4px;
4122
- background: rgba(80, 200, 120, 0.12);
4123
- color: rgb(80, 200, 120);
4124
- border: 1px solid rgba(80, 200, 120, 0.4);
4125
- margin-left: 4px;
4126
- flex-shrink: 0;
4127
- }
4128
-
4129
- .agent-row .agent-row-meta {
4130
- display: flex;
4131
- align-items: center;
4132
- gap: 4px;
4133
- margin-left: auto;
4134
- flex-shrink: 0;
4135
- }
4136
-
4137
- .agent-row .agent-config-btn {
4138
- width: 22px;
4139
- height: 22px;
4140
- border-radius: 6px;
4141
- background: transparent;
4142
- border: 1px solid var(--border);
4143
- color: var(--text-muted);
4144
- cursor: pointer;
4145
- display: inline-flex;
4146
- align-items: center;
4147
- justify-content: center;
4148
- padding: 0;
4149
- opacity: 0;
4150
- transition: var(--transition);
4151
- margin-left: 4px;
4152
- }
4153
-
4154
- .agent-row:hover .agent-config-btn {
4155
- opacity: 1;
4156
- }
4157
-
4158
- .agent-row .agent-config-btn:hover {
4159
- background: var(--accent);
4160
- color: var(--bg);
4161
- border-color: var(--accent);
4162
- }
4163
-
4164
- /* Form hints and info blocks in modals */
4165
- .form-hint {
4166
- display: block;
4167
- margin-top: 4px;
4168
- color: var(--text-muted);
4169
- font-size: 11px;
4170
- line-height: 1.4;
4171
- }
4172
-
4173
- .form-info {
4174
- margin-top: 8px;
4175
- padding: 10px 12px;
4176
- background: var(--bg-secondary);
4177
- border: 1px solid var(--border);
4178
- border-radius: var(--radius);
4179
- font-size: 12px;
4180
- color: var(--text-secondary);
4181
- word-break: break-all;
4182
- }
4183
-
4184
- .form-info code {
4185
- font-family: var(--font-mono);
4186
- color: var(--accent);
4187
- background: var(--bg);
4188
- padding: 1px 4px;
4189
- border-radius: 3px;
4190
- }
4191
-
4192
- .checkbox-label {
4193
- display: flex !important;
4194
- align-items: center;
4195
- gap: 8px;
4196
- cursor: pointer;
4197
- user-select: none;
4198
- font-size: 13px;
4199
- color: var(--text-secondary);
4200
- }
4201
-
4202
- .checkbox-label input[type="checkbox"] {
4203
- width: 16px;
4204
- height: 16px;
4205
- cursor: pointer;
4206
- accent-color: var(--accent);
4207
- }
4208
-
4209
- /* ============================================================
4210
- * 2026-06-10: 远程聊天 modal — 完全对齐本地聊天风格
4211
- * 用 CSS 变量, 字体继承全局 JetBrains Mono, 支持深/浅色主题切换
4212
- * ============================================================ */
4213
- .remote-chat-overlay {
4214
- position: fixed;
4215
- inset: 0;
4216
- background: rgba(0, 0, 0, 0.55);
4217
- z-index: 10002;
4218
- display: flex;
4219
- align-items: center;
4220
- justify-content: center;
4221
- }
4222
- .remote-chat-shell {
4223
- background: var(--bg-main);
4224
- color: var(--text);
4225
- border: 1px solid var(--border);
4226
- border-radius: 8px;
4227
- width: 720px;
4228
- max-width: 92vw;
4229
- height: 80vh;
4230
- max-height: 80vh;
4231
- display: flex;
4232
- flex-direction: column;
4233
- box-shadow: 0 10px 40px rgba(0, 0, 0, 0.35);
4234
- font-family: inherit;
4235
- }
4236
- .remote-chat-header {
4237
- padding: 12px 16px;
4238
- border-bottom: 1px solid var(--border);
4239
- display: flex;
4240
- align-items: center;
4241
- justify-content: space-between;
4242
- gap: 8px;
4243
- background: var(--bg-sidebar);
4244
- border-radius: 8px 8px 0 0;
4245
- }
4246
- .remote-chat-title {
4247
- font-size: 15px;
4248
- font-weight: 600;
4249
- color: var(--text);
4250
- }
4251
- .remote-chat-meta {
4252
- font-size: 11px;
4253
- color: var(--text-muted);
4254
- margin-top: 2px;
4255
- overflow: hidden;
4256
- text-overflow: ellipsis;
4257
- white-space: nowrap;
4258
- }
4259
- .remote-chat-btn-secondary {
4260
- background: var(--bg-hover);
4261
- border: 1px solid var(--border);
4262
- color: var(--text-secondary);
4263
- cursor: pointer;
4264
- padding: 4px 10px;
4265
- border-radius: 4px;
4266
- font-size: 11px;
4267
- font-family: inherit;
4268
- }
4269
- .remote-chat-btn-secondary:hover {
4270
- background: var(--bg-active);
4271
- color: var(--text);
4272
- }
4273
- .remote-chat-btn-close {
4274
- background: none;
4275
- border: none;
4276
- font-size: 20px;
4277
- color: var(--text-muted);
4278
- cursor: pointer;
4279
- padding: 0 8px;
4280
- line-height: 1;
4281
- }
4282
- .remote-chat-btn-close:hover {
4283
- color: var(--text);
4284
- }
4285
- .remote-chat-thinking {
4286
- padding: 8px 16px;
4287
- background: var(--bg-hover);
4288
- color: var(--text-secondary);
4289
- font-size: 12px;
4290
- border-bottom: 1px solid var(--border);
4291
- }
4292
- .remote-chat-log {
4293
- flex: 1;
4294
- overflow-y: auto;
4295
- padding: 12px 16px;
4296
- background: var(--bg-main);
4297
- }
4298
- .remote-chat-input-row {
4299
- padding: 10px 12px;
4300
- border-top: 1px solid var(--border);
4301
- display: flex;
4302
- gap: 6px;
4303
- background: var(--bg-sidebar);
4304
- border-radius: 0 0 8px 8px;
4305
- }
4306
- .remote-chat-input {
4307
- flex: 1;
4308
- padding: 8px 10px;
4309
- border: 1px solid var(--border);
4310
- border-radius: 4px;
4311
- font-size: 13px;
4312
- background: var(--bg-main);
4313
- color: var(--text);
4314
- font-family: inherit;
4315
- }
4316
- .remote-chat-input:focus {
4317
- outline: none;
4318
- border-color: var(--accent, #a4b630);
4319
- }
4320
- .remote-chat-btn-send {
4321
- padding: 8px 14px;
4322
- background: var(--user-bg);
4323
- color: var(--user-text);
4324
- border: none;
4325
- border-radius: 4px;
4326
- cursor: pointer;
4327
- font-size: 13px;
4328
- font-weight: 600;
4329
- font-family: inherit;
4330
- }
4331
- .remote-chat-btn-send:hover:not(:disabled) {
4332
- filter: brightness(1.1);
4333
- }
4334
- .remote-chat-btn-send:disabled {
4335
- opacity: 0.5;
4336
- cursor: wait;
4337
- }
4338
- .remote-chat-sysmsg {
4339
- margin: 6px 0;
4340
- padding: 6px 10px;
4341
- border-radius: 4px;
4342
- font-size: 11px;
4343
- text-align: center;
4344
- border: 1px solid var(--border);
4345
- }
4346
- .remote-chat-sysmsg-info {
4347
- background: var(--bg-hover);
4348
- color: var(--text-secondary);
4349
- }
4350
- .remote-chat-sysmsg-warn {
4351
- background: var(--bg-hover);
4352
- color: var(--text);
4353
- border-color: var(--border-light);
4354
- }
4355
- .remote-chat-sysmsg-error {
4356
- background: rgba(220, 38, 38, 0.12);
4357
- color: #fca5a5;
4358
- border-color: rgba(220, 38, 38, 0.3);
4359
- }
4360
- .remote-chat-judgments {
4361
- margin: 0 0 8px;
4362
- padding: 8px 10px;
4363
- background: var(--bg-hover);
4364
- border-left: 3px solid var(--accent, #a4b630);
4365
- border-radius: 4px;
4366
- font-size: 12px;
4367
- }
4368
- .remote-chat-judgments-title {
4369
- font-weight: 600;
4370
- color: var(--text);
4371
- margin-bottom: 4px;
4372
- }
4373
- .remote-chat-judgment-item {
4374
- margin: 3px 0;
4375
- padding-left: 8px;
4376
- color: var(--text);
4377
- }
4378
- .remote-chat-judgment-tag {
4379
- color: var(--text-muted);
4380
- font-size: 10px;
4381
- }
4382
- .remote-chat-judgment-reason {
4383
- color: var(--text-secondary);
4384
- font-size: 11px;
4385
- }
4386
- .remote-chat-judgments-foot {
4387
- margin-top: 6px;
4388
- color: var(--text-muted);
4389
- font-size: 11px;
4390
- }
4391
-
4392
- /* ============================================================
4393
- * 2026-06-10: 好友申请 modal — 对齐本地风格 + CSS 变量
4394
- * ============================================================ */
4395
- .friend-req-overlay {
4396
- position: fixed;
4397
- inset: 0;
4398
- background: rgba(0, 0, 0, 0.55);
4399
- z-index: 10004;
4400
- display: flex;
4401
- align-items: center;
4402
- justify-content: center;
4403
- }
4404
- .friend-req-shell {
4405
- background: var(--bg-main);
4406
- color: var(--text);
4407
- border: 1px solid var(--border);
4408
- border-radius: 8px;
4409
- width: 460px;
4410
- max-width: 92vw;
4411
- box-shadow: 0 10px 40px rgba(0, 0, 0, 0.4);
4412
- font-family: inherit;
4413
- }
4414
- .friend-req-header {
4415
- padding: 14px 18px;
4416
- border-bottom: 1px solid var(--border);
4417
- background: var(--bg-sidebar);
4418
- display: flex;
4419
- align-items: center;
4420
- gap: 10px;
4421
- border-radius: 8px 8px 0 0;
4422
- }
4423
- .friend-req-title {
4424
- font-size: 15px;
4425
- font-weight: 600;
4426
- color: var(--text);
4427
- }
4428
- .friend-req-meta {
4429
- font-size: 11px;
4430
- color: var(--text-muted);
4431
- margin-top: 2px;
4432
- overflow: hidden;
4433
- text-overflow: ellipsis;
4434
- white-space: nowrap;
4435
- }
4436
- .friend-req-body {
4437
- padding: 14px 18px;
4438
- font-size: 13px;
4439
- color: var(--text);
4440
- line-height: 1.5;
4441
- }
4442
- .friend-req-actions {
4443
- padding: 10px 18px;
4444
- border-top: 1px solid var(--border);
4445
- display: flex;
4446
- gap: 8px;
4447
- justify-content: flex-end;
4448
- background: var(--bg-sidebar);
4449
- border-radius: 0 0 8px 8px;
4450
- }
4451
- .friend-req-btn-deny {
4452
- padding: 6px 14px;
4453
- background: var(--bg-hover);
4454
- color: var(--text-secondary);
4455
- border: 1px solid var(--border);
4456
- border-radius: 4px;
4457
- cursor: pointer;
4458
- font-size: 13px;
4459
- font-family: inherit;
4460
- }
4461
- .friend-req-btn-deny:hover {
4462
- background: var(--bg-active);
4463
- color: var(--text);
4464
- }
4465
- .friend-req-btn-accept {
4466
- padding: 6px 14px;
4467
- background: var(--user-bg);
4468
- color: var(--user-text);
4469
- border: none;
4470
- border-radius: 4px;
4471
- cursor: pointer;
4472
- font-size: 13px;
4473
- font-weight: 600;
4474
- font-family: inherit;
4475
- }
4476
- .friend-req-btn-accept:hover {
4477
- filter: brightness(1.1);
4478
- }
4479
-
4480
- /* ============================================================
4481
- * 2026-06-10: Toast 入场动画 (simple-toast 用 — 实际用 toastFade @ L3992, toast-in 是死代码)
4482
- * ============================================================ */
4483
-
4484
- /* ============================================================
4485
- * 2026-06-10: P2P peer-group 可折叠 — 复用 #remote-agents-section.collapsed 模式
4486
- * peer header 加 .peer-caret, 点击切 .remote-peer-group.collapsed
4487
- * 折叠后隐藏 .remote-peer-channels, caret 旋转 -90deg
4488
- * ============================================================ */
4489
- .remote-peer-group .peer-caret {
4490
- display: inline-block;
4491
- font-size: 10px;
4492
- color: var(--text-muted);
4493
- transition: transform 0.15s ease;
4494
- user-select: none;
4495
- width: 12px;
4496
- text-align: center;
4497
- }
4498
- .remote-peer-group.collapsed .peer-caret {
4499
- transform: rotate(-90deg);
4500
- }
4501
- .remote-peer-group.collapsed > .remote-peer-channels {
4502
- display: none;
4503
- }
4504
- .remote-peer-group .remote-peer-header {
4505
- /* 让 caret 单独成可点区域时不撑破 header */
4506
- user-select: none;
4507
- }
4508
-
4509
- /* ============================================================
4510
- * 2026-06-11: 分享 channel modal (P2P peer 分享) — 用 friend-req-shell 风格
4511
- * ============================================================ */
4512
- .share-modal-shell {
4513
- width: 520px;
4514
- max-height: 80vh;
4515
- }
4516
- .share-modal-hint {
4517
- padding: 8px 18px;
4518
- font-size: 12px;
4519
- color: var(--text-muted);
4520
- background: var(--bg-sidebar);
4521
- border-bottom: 1px solid var(--border);
4522
- }
4523
- .share-modal-list {
4524
- flex: 1;
4525
- overflow-y: auto;
4526
- padding: 4px 18px;
4527
- max-height: 50vh;
4528
- }
4529
- .share-modal-empty {
4530
- color: var(--text-muted);
4531
- padding: 20px;
4532
- text-align: center;
4533
- }
4534
- .share-modal-row {
4535
- display: flex;
4536
- align-items: flex-start;
4537
- gap: 10px;
4538
- padding: 8px 4px;
4539
- cursor: pointer;
4540
- border-bottom: 1px solid var(--border);
4541
- font-family: inherit;
4542
- }
4543
- .share-modal-row:hover {
4544
- background: var(--bg-hover);
4545
- }
4546
- .share-modal-cb {
4547
- margin-top: 4px;
4548
- cursor: pointer;
4549
- width: 16px;
4550
- height: 16px;
4551
- accent-color: var(--accent);
4552
- }
4553
- .share-modal-row-info {
4554
- flex: 1;
4555
- min-width: 0;
4556
- }
4557
- .share-modal-row-name {
4558
- font-size: 13px;
4559
- font-weight: 500;
4560
- color: var(--text);
4561
- }
4562
- .share-modal-row-meta {
4563
- font-size: 10px;
4564
- color: var(--text-muted);
4565
- margin-top: 2px;
4566
- font-family: 'JetBrains Mono', monospace;
4567
- }
4568
-
4569
- /* ============================================================================
4570
- * 2026-06-15: step-timeline — 气泡内 4 状态步骤条
4571
- * 摘要条 (折叠态) + 详情区 (展开态) 共用同一份 steps: Step[] 数据
4572
- * 状态: idle ○ / active ● / done 🟢 / error 🔴
4573
- * ========================================================================== */
4574
-
4575
- .step-timeline {
4576
- margin: 8px 0 4px 0;
4577
- border: 1px solid var(--border);
4578
- border-radius: 6px;
4579
- background: var(--bg-hover);
4580
- font-size: 12px;
4581
- color: var(--text);
4582
- overflow: hidden;
4583
- }
4584
-
4585
- .step-timeline-summary {
4586
- display: flex;
4587
- align-items: center;
4588
- gap: 10px;
4589
- padding: 6px 10px;
4590
- cursor: pointer;
4591
- user-select: none;
4592
- transition: background 0.15s;
4593
- }
4594
- .step-timeline-summary:hover { background: var(--bg-main); }
4595
-
4596
- .step-timeline-title {
4597
- font-weight: 500;
4598
- color: var(--text-secondary);
4599
- white-space: nowrap;
4600
- font-family: 'JetBrains Mono', monospace;
4601
- font-size: 11px;
4602
- }
4603
-
4604
- .step-timeline-dots {
4605
- display: flex;
4606
- gap: 4px;
4607
- align-items: center;
4608
- flex: 1;
4609
- min-width: 0;
4610
- overflow: hidden;
4611
- }
4612
-
4613
- .step-dot {
4614
- display: inline-block;
4615
- width: 7px;
4616
- height: 7px;
4617
- border-radius: 50%;
4618
- background: var(--text-muted);
4619
- flex-shrink: 0;
4620
- transition: background 0.2s, box-shadow 0.2s;
4621
- }
4622
- .step-dot[data-status="active"] {
4623
- background: var(--accent);
4624
- box-shadow: 0 0 0 0 var(--accent);
4625
- animation: step-dot-pulse 1.4s infinite;
4626
- }
4627
- .step-dot[data-status="done"] { background: var(--success); }
4628
- .step-dot[data-status="error"] { background: var(--warning); }
4629
-
4630
- @keyframes step-dot-pulse {
4631
- 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--accent) 60%, transparent); }
4632
- 70% { box-shadow: 0 0 0 5px color-mix(in srgb, var(--accent) 0%, transparent); }
4633
- 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--accent) 0%, transparent); }
4634
- }
4635
-
4636
- .step-timeline-arrow {
4637
- font-size: 10px;
4638
- color: var(--text-muted);
4639
- transition: transform 0.2s;
4640
- flex-shrink: 0;
4641
- }
4642
-
4643
- .step-timeline-body {
4644
- max-height: 0;
4645
- overflow: hidden;
4646
- transition: max-height 0.3s ease-in-out;
4647
- border-top: 1px solid transparent;
4648
- }
4649
- .step-timeline:not([data-empty]) .step-timeline-body {
4650
- /* 内容存在时给 body 一个合理上限, 避免长任务撑爆 */
4651
- max-height: 320px;
4652
- overflow-y: auto;
4653
- border-top-color: var(--border);
4654
- }
4655
-
4656
- .step-timeline-list {
4657
- list-style: none;
4658
- margin: 0;
4659
- padding: 6px 10px 8px 24px;
4660
- position: relative;
4661
- }
4662
- /* 详情区垂直时间轴线 */
4663
- .step-timeline-list::before {
4664
- content: '';
4665
- position: absolute;
4666
- left: 14px;
4667
- top: 12px;
4668
- bottom: 12px;
4669
- width: 1px;
4670
- background: var(--border);
4671
- }
4672
-
4673
- .step-timeline-node {
4674
- position: relative;
4675
- padding: 4px 0;
4676
- font-size: 12px;
4677
- line-height: 1.5;
4678
- color: var(--text-secondary);
4679
- display: flex;
4680
- align-items: baseline;
4681
- gap: 8px;
4682
- }
4683
- .step-timeline-node:last-child { padding-bottom: 2px; }
4684
-
4685
- .step-timeline-marker {
4686
- position: absolute;
4687
- left: -18px;
4688
- top: 9px;
4689
- width: 9px;
4690
- height: 9px;
4691
- border-radius: 50%;
4692
- background: var(--text-muted);
4693
- border: 2px solid var(--bg-hover);
4694
- box-shadow: 0 0 0 1px var(--border);
4695
- flex-shrink: 0;
4696
- transition: background 0.2s, box-shadow 0.2s;
4697
- }
4698
- .step-timeline-node[data-status="active"] .step-timeline-marker {
4699
- background: var(--accent);
4700
- box-shadow: 0 0 0 1px var(--accent);
4701
- animation: step-dot-pulse 1.4s infinite;
4702
- }
4703
- .step-timeline-node[data-status="done"] .step-timeline-marker { background: var(--success); box-shadow: 0 0 0 1px var(--success); }
4704
- .step-timeline-node[data-status="error"] .step-timeline-marker { background: var(--warning); box-shadow: 0 0 0 1px var(--warning); }
4705
-
4706
- .step-timeline-label {
4707
- font-family: 'JetBrains Mono', monospace;
4708
- font-size: 11px;
4709
- color: var(--text);
4710
- flex-shrink: 0;
4711
- }
4712
- .step-timeline-node[data-status="error"] .step-timeline-label { color: var(--warning); }
4713
- .step-timeline-node[data-status="done"] .step-timeline-label { color: var(--success); }
4714
-
4715
- .step-timeline-args {
4716
- font-family: 'JetBrains Mono', monospace;
4717
- font-size: 10px;
4718
- color: var(--text-muted);
4719
- white-space: nowrap;
4720
- overflow: hidden;
4721
- text-overflow: ellipsis;
4722
- flex: 1;
4723
- min-width: 0;
4724
- }
4725
-
4726
- .step-timeline-more {
4727
- list-style: none;
4728
- padding: 4px 0 4px 0;
4729
- margin: 0;
4730
- font-size: 11px;
4731
- color: var(--accent);
4732
- cursor: pointer;
4733
- user-select: none;
4734
- font-family: 'JetBrains Mono', monospace;
4735
- }
4736
- .step-timeline-more:hover { text-decoration: underline; }
4737
-