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