@bolloon/bolloon-agent 0.1.0

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 (808) hide show
  1. package/README.md +462 -0
  2. package/dist/agents/constraint-layer.js +211 -0
  3. package/dist/agents/constraint-layer.js.map +1 -0
  4. package/dist/agents/pi-sdk.js +1199 -0
  5. package/dist/agents/pi-sdk.js.map +1 -0
  6. package/dist/agents/protocol.js +229 -0
  7. package/dist/agents/subagent-manager.js +361 -0
  8. package/dist/agents/workflow-engine.js +222 -0
  9. package/dist/agents/workflow-engine.js.map +1 -0
  10. package/dist/bollharness-integration/bollharness-integration/context-router-judgment.d.ts +48 -0
  11. package/dist/bollharness-integration/bollharness-integration/context-router-judgment.js +261 -0
  12. package/dist/bollharness-integration/bollharness-integration/context-router.d.ts +110 -0
  13. package/dist/bollharness-integration/bollharness-integration/context-router.js +542 -0
  14. package/dist/bollharness-integration/bollharness-integration/gate-state-machine.d.ts +87 -0
  15. package/dist/bollharness-integration/bollharness-integration/gate-state-machine.js +231 -0
  16. package/dist/bollharness-integration/bollharness-integration/gate-transition-hooks.d.ts +30 -0
  17. package/dist/bollharness-integration/bollharness-integration/gate-transition-hooks.js +91 -0
  18. package/dist/bollharness-integration/bollharness-integration/guard-checker.d.ts +105 -0
  19. package/dist/bollharness-integration/bollharness-integration/guard-checker.js +353 -0
  20. package/dist/bollharness-integration/bollharness-integration/index.d.ts +66 -0
  21. package/dist/bollharness-integration/bollharness-integration/index.js +32 -0
  22. package/dist/bollharness-integration/bollharness-integration/integration.d.ts +219 -0
  23. package/dist/bollharness-integration/bollharness-integration/integration.js +420 -0
  24. package/dist/bollharness-integration/bollharness-integration/skill-adapter.d.ts +151 -0
  25. package/dist/bollharness-integration/bollharness-integration/skill-adapter.js +518 -0
  26. package/dist/bollharness-integration/context-router-judgment.js +269 -0
  27. package/dist/bollharness-integration/context-router-judgment.js.map +1 -0
  28. package/dist/bollharness-integration/context-router.js +584 -0
  29. package/dist/bollharness-integration/context-router.js.map +1 -0
  30. package/dist/bollharness-integration/gate-state-machine.js +349 -0
  31. package/dist/bollharness-integration/gate-state-machine.js.map +1 -0
  32. package/dist/bollharness-integration/gate-transition-hooks.js +136 -0
  33. package/dist/bollharness-integration/gate-transition-hooks.js.map +1 -0
  34. package/dist/bollharness-integration/guard-checker.js +400 -0
  35. package/dist/bollharness-integration/guard-checker.js.map +1 -0
  36. package/dist/bollharness-integration/index.js +142 -0
  37. package/dist/bollharness-integration/index.js.map +1 -0
  38. package/dist/bollharness-integration/integration.js +427 -0
  39. package/dist/bollharness-integration/integration.js.map +1 -0
  40. package/dist/bollharness-integration/llm/pi-ai.d.ts +60 -0
  41. package/dist/bollharness-integration/llm/pi-ai.js +397 -0
  42. package/dist/bollharness-integration/pi-ecosystem-colony/index.d.ts +153 -0
  43. package/dist/bollharness-integration/pi-ecosystem-colony/index.js +365 -0
  44. package/dist/bollharness-integration/pi-ecosystem-goals/index.d.ts +136 -0
  45. package/dist/bollharness-integration/pi-ecosystem-goals/index.js +458 -0
  46. package/dist/bollharness-integration/pi-ecosystem-judgment/decision.d.ts +117 -0
  47. package/dist/bollharness-integration/pi-ecosystem-judgment/decision.js +300 -0
  48. package/dist/bollharness-integration/pi-ecosystem-judgment/distillation.d.ts +78 -0
  49. package/dist/bollharness-integration/pi-ecosystem-judgment/distillation.js +291 -0
  50. package/dist/bollharness-integration/pi-ecosystem-judgment/index.d.ts +139 -0
  51. package/dist/bollharness-integration/pi-ecosystem-judgment/index.js +445 -0
  52. package/dist/bollharness-integration/pi-ecosystem-mcp/index.d.ts +127 -0
  53. package/dist/bollharness-integration/pi-ecosystem-mcp/index.js +331 -0
  54. package/dist/bollharness-integration/pi-ecosystem-subagents/index.d.ts +95 -0
  55. package/dist/bollharness-integration/pi-ecosystem-subagents/index.js +303 -0
  56. package/dist/bollharness-integration/skill-adapter.js +564 -0
  57. package/dist/bollharness-integration/skill-adapter.js.map +1 -0
  58. package/dist/cli/interface.js +181 -0
  59. package/dist/constraint-runtime/src/_archive_helper.js +9 -0
  60. package/dist/constraint-runtime/src/agent/coordinator.js +48 -0
  61. package/dist/constraint-runtime/src/agent/index.js +1 -0
  62. package/dist/constraint-runtime/src/assistant/index.js +12 -0
  63. package/dist/constraint-runtime/src/bootstrap/index.js +12 -0
  64. package/dist/constraint-runtime/src/bootstrap_graph.js +13 -0
  65. package/dist/constraint-runtime/src/bridge/index.js +12 -0
  66. package/dist/constraint-runtime/src/buddy/index.js +12 -0
  67. package/dist/constraint-runtime/src/cli/index.js +12 -0
  68. package/dist/constraint-runtime/src/command_graph.js +10 -0
  69. package/dist/constraint-runtime/src/commands.js +50 -0
  70. package/dist/constraint-runtime/src/components/index.js +12 -0
  71. package/dist/constraint-runtime/src/constants/index.js +12 -0
  72. package/dist/constraint-runtime/src/constraint/budget.js +27 -0
  73. package/dist/constraint-runtime/src/constraint/budget.js.map +1 -0
  74. package/dist/constraint-runtime/src/constraint/index.js +2 -0
  75. package/dist/constraint-runtime/src/constraint/permission.js +25 -0
  76. package/dist/constraint-runtime/src/constraint/permission.js.map +1 -0
  77. package/dist/constraint-runtime/src/context.js +30 -0
  78. package/dist/constraint-runtime/src/coordinator/index.js +12 -0
  79. package/dist/constraint-runtime/src/cost_hook.js +4 -0
  80. package/dist/constraint-runtime/src/cost_tracker.js +8 -0
  81. package/dist/constraint-runtime/src/deferred_init.js +10 -0
  82. package/dist/constraint-runtime/src/direct_modes.js +6 -0
  83. package/dist/constraint-runtime/src/dynamic-tool-loader.js +85 -0
  84. package/dist/constraint-runtime/src/entrypoints/index.js +12 -0
  85. package/dist/constraint-runtime/src/execution_registry.js +44 -0
  86. package/dist/constraint-runtime/src/history.js +9 -0
  87. package/dist/constraint-runtime/src/hooks/index.js +12 -0
  88. package/dist/constraint-runtime/src/index.js +26 -0
  89. package/dist/constraint-runtime/src/ink.js +4 -0
  90. package/dist/constraint-runtime/src/keybindings/index.js +12 -0
  91. package/dist/constraint-runtime/src/memdir/index.js +12 -0
  92. package/dist/constraint-runtime/src/migrations/index.js +12 -0
  93. package/dist/constraint-runtime/src/models.js +3 -0
  94. package/dist/constraint-runtime/src/models.js.map +1 -0
  95. package/dist/constraint-runtime/src/moreright/index.js +12 -0
  96. package/dist/constraint-runtime/src/native_ts/index.js +12 -0
  97. package/dist/constraint-runtime/src/output_styles/index.js +12 -0
  98. package/dist/constraint-runtime/src/parity_audit.js +12 -0
  99. package/dist/constraint-runtime/src/plugins/index.js +12 -0
  100. package/dist/constraint-runtime/src/port_manifest.js +11 -0
  101. package/dist/constraint-runtime/src/prefetch.js +9 -0
  102. package/dist/constraint-runtime/src/query.js +1 -0
  103. package/dist/constraint-runtime/src/remote/index.js +12 -0
  104. package/dist/constraint-runtime/src/remote_runtime.js +9 -0
  105. package/dist/constraint-runtime/src/runtime/index.js +1 -0
  106. package/dist/constraint-runtime/src/runtime/session.js +35 -0
  107. package/dist/constraint-runtime/src/schemas/index.js +12 -0
  108. package/dist/constraint-runtime/src/screens/index.js +12 -0
  109. package/dist/constraint-runtime/src/server/index.js +12 -0
  110. package/dist/constraint-runtime/src/services/index.js +12 -0
  111. package/dist/constraint-runtime/src/session_store.js +22 -0
  112. package/dist/constraint-runtime/src/setup.js +30 -0
  113. package/dist/constraint-runtime/src/skills/index.js +1 -0
  114. package/dist/constraint-runtime/src/skills/skill-registry.js +28 -0
  115. package/dist/constraint-runtime/src/state/index.js +12 -0
  116. package/dist/constraint-runtime/src/system_init.js +20 -0
  117. package/dist/constraint-runtime/src/thinking/engine.js +42 -0
  118. package/dist/constraint-runtime/src/thinking/index.js +1 -0
  119. package/dist/constraint-runtime/src/tool_pool.js +8 -0
  120. package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +7 -0
  121. package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +7 -0
  122. package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +7 -0
  123. package/dist/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.js +6 -0
  124. package/dist/constraint-runtime/src/tools/PolymarketSDK/createOrder.js +6 -0
  125. package/dist/constraint-runtime/src/tools/PolymarketSDK/getMarket.js +5 -0
  126. package/dist/constraint-runtime/src/tools/PolymarketSDK/getOrders.js +6 -0
  127. package/dist/constraint-runtime/src/tools/PolymarketSDK/listMarkets.js +4 -0
  128. package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +6 -0
  129. package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +8 -0
  130. package/dist/constraint-runtime/src/tools/SafeSDK/deploySafe.js +6 -0
  131. package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +6 -0
  132. package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +6 -0
  133. package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +6 -0
  134. package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +6 -0
  135. package/dist/constraint-runtime/src/tools/WalletTools/autoPay.js +29 -0
  136. package/dist/constraint-runtime/src/tools/WalletTools/createWallet.js +10 -0
  137. package/dist/constraint-runtime/src/tools/WalletTools/getBalance.js +13 -0
  138. package/dist/constraint-runtime/src/tools/WalletTools/importWallet.js +22 -0
  139. package/dist/constraint-runtime/src/tools/WalletTools/sendTransaction.js +25 -0
  140. package/dist/constraint-runtime/src/tools/WalletTools/signMessage.js +10 -0
  141. package/dist/constraint-runtime/src/tools/WalletTools/transferToken.js +25 -0
  142. package/dist/constraint-runtime/src/tools.js +70 -0
  143. package/dist/constraint-runtime/src/transcript.js +19 -0
  144. package/dist/constraint-runtime/src/types/index.js +12 -0
  145. package/dist/constraint-runtime/src/upstream_proxy/index.js +12 -0
  146. package/dist/constraint-runtime/src/utils/index.js +12 -0
  147. package/dist/constraint-runtime/src/vim/index.js +12 -0
  148. package/dist/constraint-runtime/src/voice/index.js +12 -0
  149. package/dist/constraint-runtime/tests/agent.test.js +16 -0
  150. package/dist/constraint-runtime/tests/constraint.test.js +41 -0
  151. package/dist/constraint-runtime/tests/skill.test.js +19 -0
  152. package/dist/constraint-runtime/tests/thinking.test.js +22 -0
  153. package/dist/constraints/commands.js +100 -0
  154. package/dist/constraints/index.js +11 -0
  155. package/dist/constraints/index.js.map +1 -0
  156. package/dist/constraints/permissions.js +37 -0
  157. package/dist/constraints/runtime.js +135 -0
  158. package/dist/constraints/session.js +48 -0
  159. package/dist/constraints/system-init.js +51 -0
  160. package/dist/constraints/tools.js +104 -0
  161. package/dist/documents/reader.js +104 -0
  162. package/dist/documents/reader.js.map +1 -0
  163. package/dist/electron-preload.js +15 -0
  164. package/dist/electron-preload.js.map +1 -0
  165. package/dist/electron.js +206 -0
  166. package/dist/electron.js.map +1 -0
  167. package/dist/index.js +1053 -0
  168. package/dist/llm/config-store.js +301 -0
  169. package/dist/llm/config-store.js.map +1 -0
  170. package/dist/llm/minimax-provider.js +46 -0
  171. package/dist/llm/minimax.js +45 -0
  172. package/dist/llm/pi-ai.js +471 -0
  173. package/dist/llm/pi-ai.js.map +1 -0
  174. package/dist/network/agent-network.js +692 -0
  175. package/dist/network/agent-network.js.map +1 -0
  176. package/dist/network/iroh-integration.js +117 -0
  177. package/dist/network/iroh-integration.js.map +1 -0
  178. package/dist/network/iroh-transport.js +506 -0
  179. package/dist/network/iroh-transport.js.map +1 -0
  180. package/dist/network/p2p.js +864 -0
  181. package/dist/network/p2p.js.map +1 -0
  182. package/dist/network/storage/adapters/json-adapter.js +401 -0
  183. package/dist/network/storage/adapters/json-adapter.js.map +1 -0
  184. package/dist/pi-ecosystem-colony/index.js +426 -0
  185. package/dist/pi-ecosystem-colony/index.js.map +1 -0
  186. package/dist/pi-ecosystem-goals/index.js +512 -0
  187. package/dist/pi-ecosystem-goals/index.js.map +1 -0
  188. package/dist/pi-ecosystem-judgment/decision.js +318 -0
  189. package/dist/pi-ecosystem-judgment/decision.js.map +1 -0
  190. package/dist/pi-ecosystem-judgment/distillation.js +304 -0
  191. package/dist/pi-ecosystem-judgment/distillation.js.map +1 -0
  192. package/dist/pi-ecosystem-judgment/human-value-store.js +463 -0
  193. package/dist/pi-ecosystem-judgment/human-value-store.js.map +1 -0
  194. package/dist/pi-ecosystem-judgment/index.js +581 -0
  195. package/dist/pi-ecosystem-judgment/index.js.map +1 -0
  196. package/dist/pi-ecosystem-judgment/value-injection.js +592 -0
  197. package/dist/pi-ecosystem-judgment/value-injection.js.map +1 -0
  198. package/dist/pi-ecosystem-mcp/index.js +385 -0
  199. package/dist/pi-ecosystem-mcp/index.js.map +1 -0
  200. package/dist/pi-ecosystem-subagents/index.js +352 -0
  201. package/dist/pi-ecosystem-subagents/index.js.map +1 -0
  202. package/dist/runtime/context/minimax-prompt.js +178 -0
  203. package/dist/runtime/context/sys-prompt.js +1 -0
  204. package/dist/social/ant-colony/AdaptiveHeartbeat.js +106 -0
  205. package/dist/social/ant-colony/AdaptiveHeartbeat.js.map +1 -0
  206. package/dist/social/ant-colony/PheromoneEngine.js +265 -0
  207. package/dist/social/ant-colony/PheromoneEngine.js.map +1 -0
  208. package/dist/social/ant-colony/types.js +28 -0
  209. package/dist/social/ant-colony/types.js.map +1 -0
  210. package/dist/social/channels/ChannelManager.js +444 -0
  211. package/dist/social/channels/ChannelManager.js.map +1 -0
  212. package/dist/social/channels/DiapChannelBridge.js +451 -0
  213. package/dist/social/channels/DiapChannelBridge.js.map +1 -0
  214. package/dist/social/channels/InterestMatcher.js +135 -0
  215. package/dist/social/channels/InterestMatcher.js.map +1 -0
  216. package/dist/social/channels/types.js +21 -0
  217. package/dist/social/channels/types.js.map +1 -0
  218. package/dist/social/global-shared-context.js +368 -0
  219. package/dist/social/global-shared-context.js.map +1 -0
  220. package/dist/social/heartbeat.js +865 -0
  221. package/dist/social/heartbeat.js.map +1 -0
  222. package/dist/test/constraint-layer.test.js +164 -0
  223. package/dist/test/global-shared-context.test.js +315 -0
  224. package/dist/test/pi-sdk.test.js +47 -0
  225. package/dist/test/set-persona.test.js +38 -0
  226. package/dist/test/subagent-manager.test.js +276 -0
  227. package/dist/test/workflow-engine.test.js +87 -0
  228. package/dist/web/api-config.html +265 -0
  229. package/dist/web/client.js +1401 -0
  230. package/dist/web/components/p2p/index.js +357 -0
  231. package/dist/web/components/p2p/p2p-connection.js +161 -0
  232. package/dist/web/components/p2p/p2p-identity.js +78 -0
  233. package/dist/web/components/p2p/p2p-manager.js +82 -0
  234. package/dist/web/components/p2p/p2p-messages.js +186 -0
  235. package/dist/web/components/p2p/p2p-store-memory.js +129 -0
  236. package/dist/web/components/p2p/types.js +23 -0
  237. package/dist/web/index.html +192 -0
  238. package/dist/web/server.js +1647 -0
  239. package/dist/web/server.js.map +1 -0
  240. package/dist/web/style.css +3260 -0
  241. package/dist/workflows/collaboration.js +374 -0
  242. package/dist/workflows/index.js +54 -0
  243. package/docs/agent-communication.md +333 -0
  244. package/docs/plans/2026-05-15-document-agent-design.md +479 -0
  245. package/docs/plans/2026-05-15-document-agent-implementation-plan.md +792 -0
  246. package/docs/plans/2026-05-16-chat-ui-design.md +86 -0
  247. package/docs/plans/2026-05-16-constraint-runtime-design.md +106 -0
  248. package/docs/plans/2026-05-16-constraint-runtime-implementation.md +441 -0
  249. package/docs//346/225/260/345/255/246/350/276/205/345/212/251/346/231/272/350/203/275/344/275/223-/346/240/270/345/277/203/346/225/210/346/236/234/345/256/232/344/271/211.md +287 -0
  250. package/package.json +121 -0
  251. package/scripts/build-web.ts +61 -0
  252. package/src/agents/constraint-layer.ts +309 -0
  253. package/src/agents/pi-sdk.ts +1591 -0
  254. package/src/agents/protocol.ts +304 -0
  255. package/src/agents/subagent-manager.ts +553 -0
  256. package/src/agents/workflow-engine.ts +332 -0
  257. package/src/bollharness/.boll/CLAUDE.md.template +34 -0
  258. package/src/bollharness/.boll/MANIFEST.yaml +213 -0
  259. package/src/bollharness/.boll/active-review-agents/.gitkeep +0 -0
  260. package/src/bollharness/.boll/agents/review-base.yaml +108 -0
  261. package/src/bollharness/.boll/deploy-allowlist.yaml +38 -0
  262. package/src/bollharness/.boll/inbox/schema/message-v1.json +99 -0
  263. package/src/bollharness/.boll/install-staging/.gitkeep +0 -0
  264. package/src/bollharness/.boll/issue-adapter.yaml +31 -0
  265. package/src/bollharness/.boll/plugins/boll-mode-toolkit/contracts/mode-contract.md +85 -0
  266. package/src/bollharness/.boll/plugins/boll-review-toolkit/contracts/evidence-packet-schema.json +102 -0
  267. package/src/bollharness/.boll/plugins/boll-review-toolkit/contracts/review-contract.yaml +247 -0
  268. package/src/bollharness/.boll/rules/backend-routes.md +31 -0
  269. package/src/bollharness/.boll/rules/closure-semantics.md +30 -0
  270. package/src/bollharness/.boll/rules/env-vars.md +32 -0
  271. package/src/bollharness/.boll/rules/hanis-protocol.md +145 -0
  272. package/src/bollharness/.boll/rules/repo-structure.md +42 -0
  273. package/src/bollharness/.boll/rules/review-agent-isolation.md +73 -0
  274. package/src/bollharness/.boll/rules/source-of-truth.md +33 -0
  275. package/src/bollharness/.boll/settings.json +180 -0
  276. package/src/bollharness/.boll/settings.json.template +31 -0
  277. package/src/bollharness/.boll/skills/arch/SKILL.md +372 -0
  278. package/src/bollharness/.boll/skills/bug-pipeline/SKILL.md +168 -0
  279. package/src/bollharness/.boll/skills/bug-triage/SKILL.md +161 -0
  280. package/src/bollharness/.boll/skills/context-chains/SKILL.md +250 -0
  281. package/src/bollharness/.boll/skills/context-chains/context-chain-index.md +48 -0
  282. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/code_change_extractor.ts +142 -0
  283. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/debugging_extractor.ts +126 -0
  284. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/design_extractor.ts +148 -0
  285. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/planning_extractor.ts +162 -0
  286. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/question_extractor.ts +116 -0
  287. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/review_extractor.ts +136 -0
  288. package/src/bollharness/.boll/skills/crystal-learn/SKILL.md +93 -0
  289. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-0.md +34 -0
  290. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-1.md +34 -0
  291. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-2.md +35 -0
  292. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-3.md +34 -0
  293. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-4.md +43 -0
  294. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-5.md +34 -0
  295. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-6.md +37 -0
  296. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-7.md +46 -0
  297. package/src/bollharness/.boll/skills/guardian-fixer/PROMPT.md +415 -0
  298. package/src/bollharness/.boll/skills/guardian-fixer/SKILL.md +320 -0
  299. package/src/bollharness/.boll/skills/harness-dev/SKILL.md +93 -0
  300. package/src/bollharness/.boll/skills/harness-dev/examples/README.md +227 -0
  301. package/src/bollharness/.boll/skills/harness-dev-handoff/SKILL.md +165 -0
  302. package/src/bollharness/.boll/skills/harness-eng/SKILL.md +110 -0
  303. package/src/bollharness/.boll/skills/harness-eng-test/SKILL.md +79 -0
  304. package/src/bollharness/.boll/skills/harness-lab/SKILL.md +170 -0
  305. package/src/bollharness/.boll/skills/harness-ops/SKILL.md +57 -0
  306. package/src/bollharness/.boll/skills/harness-voice/SKILL.md +183 -0
  307. package/src/bollharness/.boll/skills/judgment/SKILL.md +115 -0
  308. package/src/bollharness/.boll/skills/lead/SKILL.md +245 -0
  309. package/src/bollharness/.boll/skills/lead/install-wow-harness.md +77 -0
  310. package/src/bollharness/.boll/skills/lead/ref-review-sop.md +91 -0
  311. package/src/bollharness/.boll/skills/lead/ref-stages.md +129 -0
  312. package/src/bollharness/.boll/skills/skill-discovery/SKILL.md +169 -0
  313. package/src/bollharness/.boll/skills/task-arch/SKILL.md +106 -0
  314. package/src/bollharness/.boll/skills/toolkit/SKILL.md +57 -0
  315. package/src/bollharness/.boll/tasks/.gitkeep +0 -0
  316. package/src/bollharness/.boll/toolkit-index.yaml +112 -0
  317. package/src/bollharness/.claude/agents/review-base.yaml +108 -0
  318. package/src/bollharness/.claude/plugins/boll-mode-toolkit/.claude-plugin/plugin.json +44 -0
  319. package/src/bollharness/.claude/plugins/boll-review-toolkit/.claude-plugin/plugin.json +24 -0
  320. package/src/bollharness/.claude/plugins/boll-review-toolkit/contracts/evidence-packet-schema.json +102 -0
  321. package/src/bollharness/.claude/plugins/boll-review-toolkit/contracts/review-contract.yaml +247 -0
  322. package/src/bollharness/.claude/settings.json +157 -0
  323. package/src/bollharness/.claude/skills/arch/SKILL.md +64 -0
  324. package/src/bollharness/.claude/skills/crystal-learn/SKILL.md +93 -0
  325. package/src/bollharness/.claude/skills/guardian-fixer/PROMPT.md +44 -0
  326. package/src/bollharness/.claude/skills/guardian-fixer/SKILL.md +324 -0
  327. package/src/bollharness/.claude/skills/harness-dev/SKILL.md +93 -0
  328. package/src/bollharness/.claude/skills/harness-dev/examples/README.md +17 -0
  329. package/src/bollharness/.claude/skills/harness-dev-handoff/SKILL.md +165 -0
  330. package/src/bollharness/.claude/skills/harness-eng/SKILL.md +183 -0
  331. package/src/bollharness/.claude/skills/harness-eng-test/SKILL.md +57 -0
  332. package/src/bollharness/.claude/skills/harness-ops/SKILL.md +57 -0
  333. package/src/bollharness/.claude/skills/harness-voice/SKILL.md +84 -0
  334. package/src/bollharness/.claude/skills/lead/INDEX.md +28 -0
  335. package/src/bollharness/.claude/skills/lead/SKILL.md +24 -0
  336. package/src/bollharness/.claude/skills/lead/install-wow-harness.md +77 -0
  337. package/src/bollharness/.claude/skills/lead/ref-review-sop.md +48 -0
  338. package/src/bollharness/.claude/skills/lead/ref-stages.md +58 -0
  339. package/src/bollharness/.claude/skills/plan-lock/SKILL.md +74 -0
  340. package/src/bollharness/.claude/skills/skill-discovery/SKILL.md +120 -0
  341. package/src/bollharness/.claude/skills/task-arch/SKILL.md +106 -0
  342. package/src/bollharness/.claude/skills/toolkit/SKILL.md +57 -0
  343. package/src/bollharness/.claude/skills/toolkit/list.sh +92 -0
  344. package/src/bollharness/.githooks/pre-commit +21 -0
  345. package/src/bollharness/.github/workflows/ci.yml +88 -0
  346. package/src/bollharness/.sanitize-report.json +13 -0
  347. package/src/bollharness/CLAUDE.md +73 -0
  348. package/src/bollharness/LICENSE +21 -0
  349. package/src/bollharness/README.md +143 -0
  350. package/src/bollharness/README.zh-CN.md +131 -0
  351. package/src/bollharness/docs/decisions/ADR-030-guard-signal-protocol-and-governance-reload.md +1076 -0
  352. package/src/bollharness/docs/decisions/ADR-038-harness-optimization-strategy.md +2039 -0
  353. package/src/bollharness/docs/decisions/ADR-041-codex-claude-code-division-of-labor.md +128 -0
  354. package/src/bollharness/docs/decisions/ADR-H1-crystal-learn-revival.md +188 -0
  355. package/src/bollharness/docs/decisions/ADR-H2-identity-isolation.md +183 -0
  356. package/src/bollharness/docs/decisions/ADR-H3-memory-scope.md +133 -0
  357. package/src/bollharness/docs/decisions/ADR-H4-prompt-governance.md +146 -0
  358. package/src/bollharness/docs/decisions/ADR-H5-gate-quantization.md +212 -0
  359. package/src/bollharness/docs/decisions/ADR-H6-state-file-health.md +211 -0
  360. package/src/bollharness/docs/decisions/ADR-H8-issue-and-doc-compliance.md +202 -0
  361. package/src/bollharness/docs/decisions/ADR-H9-mailbox.md +231 -0
  362. package/src/bollharness/docs/decisions/PLAN-H1-crystal-learn-revival.md +270 -0
  363. package/src/bollharness/docs/decisions/PLAN-H2-identity-isolation.md +291 -0
  364. package/src/bollharness/docs/decisions/PLAN-H3-memory-scope.md +228 -0
  365. package/src/bollharness/docs/decisions/PLAN-H4-prompt-governance.md +227 -0
  366. package/src/bollharness/docs/decisions/PLAN-H5-gate-quantization.md +239 -0
  367. package/src/bollharness/docs/decisions/PLAN-H6-state-file-health.md +325 -0
  368. package/src/bollharness/docs/decisions/PLAN-H8-issue-and-doc-compliance.md +242 -0
  369. package/src/bollharness/docs/decisions/PLAN-H9-mailbox.md +378 -0
  370. package/src/bollharness/docs/launch-article-en.md +276 -0
  371. package/src/bollharness/docs/launch-article-zh.md +305 -0
  372. package/src/bollharness/docs/practice.html +356 -0
  373. package/src/bollharness/docs/practice.md +82 -0
  374. package/src/bollharness/docs/research/round-1/README.md +11 -0
  375. package/src/bollharness/docs/research/round-2/README.md +11 -0
  376. package/src/bollharness/docs/research/round-3/README.md +11 -0
  377. package/src/bollharness/docs/research/round-4/README.md +11 -0
  378. package/src/bollharness/docs/research/round-5/README.md +11 -0
  379. package/src/bollharness/docs/research/round-6/README.md +11 -0
  380. package/src/bollharness/package-lock.json +48 -0
  381. package/src/bollharness/package.json +20 -0
  382. package/src/bollharness/reference/SOURCE-COMMIT.txt +3 -0
  383. package/src/bollharness/reference/boll-reference/.claude/rules/backend-routes.md +268 -0
  384. package/src/bollharness/reference/boll-reference/.claude/rules/bridge.md +20 -0
  385. package/src/bollharness/reference/boll-reference/.claude/rules/closure-semantics.md +30 -0
  386. package/src/bollharness/reference/boll-reference/.claude/rules/coaching.md +13 -0
  387. package/src/bollharness/reference/boll-reference/.claude/rules/env-vars.md +50 -0
  388. package/src/bollharness/reference/boll-reference/.claude/rules/hackathon.md +12 -0
  389. package/src/bollharness/reference/boll-reference/.claude/rules/repo-structure.md +184 -0
  390. package/src/bollharness/reference/boll-reference/.claude/rules/review-agent-isolation.md +112 -0
  391. package/src/bollharness/reference/boll-reference/.claude/rules/scenes.md +12 -0
  392. package/src/bollharness/reference/boll-reference/.claude/skills/arch/SKILL.md +551 -0
  393. package/src/bollharness/reference/boll-reference/.claude/skills/boll-animation/SKILL.md +26 -0
  394. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/SKILL.md +227 -0
  395. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/agents/openai.yaml +4 -0
  396. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/references/bridge-failure-taxonomy.md +142 -0
  397. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/references/bridge-validation-ladder.md +107 -0
  398. package/src/bollharness/reference/boll-reference/.claude/skills/boll-crystal/SKILL.md +893 -0
  399. package/src/bollharness/reference/boll-reference/.claude/skills/boll-crystal-learn/SKILL.md +89 -0
  400. package/src/bollharness/reference/boll-reference/.claude/skills/boll-dev/SKILL.md +93 -0
  401. package/src/bollharness/reference/boll-reference/.claude/skills/boll-dev/examples/README.md +209 -0
  402. package/src/bollharness/reference/boll-reference/.claude/skills/boll-dev-handoff/SKILL.md +165 -0
  403. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng/SKILL.md +110 -0
  404. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-frontend/SKILL.md +203 -0
  405. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-hdc/SKILL.md +27 -0
  406. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-orchestrator/SKILL.md +28 -0
  407. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-prompt/SKILL.md +27 -0
  408. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-test/SKILL.md +79 -0
  409. package/src/bollharness/reference/boll-reference/.claude/skills/boll-lab/SKILL.md +372 -0
  410. package/src/bollharness/reference/boll-reference/.claude/skills/boll-run/SKILL.md +437 -0
  411. package/src/bollharness/reference/boll-reference/.claude/skills/boll-ux-appstore/SKILL.md +27 -0
  412. package/src/bollharness/reference/boll-reference/.claude/skills/boll-voice/SKILL.md +442 -0
  413. package/src/bollharness/reference/boll-reference/.claude/skills/guardian-fixer/PROMPT.md +421 -0
  414. package/src/bollharness/reference/boll-reference/.claude/skills/guardian-fixer/SKILL.md +326 -0
  415. package/src/bollharness/reference/boll-reference/.claude/skills/lead/SKILL.md +155 -0
  416. package/src/bollharness/reference/boll-reference/.claude/skills/lead/ref-review-sop.md +91 -0
  417. package/src/bollharness/reference/boll-reference/.claude/skills/lead/ref-stages.md +129 -0
  418. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-preview.png +0 -0
  419. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-v2.png +0 -0
  420. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-v3.png +0 -0
  421. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-v4.png +0 -0
  422. package/src/bollharness/reference/boll-reference/.claude/skills/plan-lock/SKILL.md +425 -0
  423. package/src/bollharness/reference/boll-reference/.claude/skills/plan-lock/ref-three-checks.md +62 -0
  424. package/src/bollharness/reference/boll-reference/.claude/skills/plan-lock/ref-wp-templates.md +78 -0
  425. package/src/bollharness/reference/boll-reference/.claude/skills/task-arch/SKILL.md +76 -0
  426. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-graph/SKILL.md +57 -0
  427. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-graph/beads-graph.sh +153 -0
  428. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-init/SKILL.md +52 -0
  429. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-init/beads-auto-link.sh +76 -0
  430. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-sync/SKILL.md +50 -0
  431. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-sync/beads-sync-proj.sh +108 -0
  432. package/src/bollharness/reference/boll-reference/docs/architecture/AGENT-PROFILE.md +151 -0
  433. package/src/bollharness/reference/boll-reference/docs/architecture/COST-STRUCTURE.md +56 -0
  434. package/src/bollharness/reference/boll-reference/docs/architecture/INDEX.md +76 -0
  435. package/src/bollharness/reference/boll-reference/docs/architecture/MODULE1-INTENT-FIELD.md +116 -0
  436. package/src/bollharness/reference/boll-reference/docs/architecture/MODULE2-CRYSTALLIZATION.md +200 -0
  437. package/src/bollharness/reference/boll-reference/docs/architecture/PRINCIPLES.md +84 -0
  438. package/src/bollharness/reference/boll-reference/docs/architecture/PROTOCOL-CORE.md +209 -0
  439. package/src/bollharness/reference/boll-reference/docs/architecture/VISION.md +181 -0
  440. package/src/bollharness/reference/boll-reference/docs/architecture/discussions/D-01-MARKET-SCENE-PROTOCOL.md +754 -0
  441. package/src/bollharness/reference/boll-reference/scripts/hooks/.sanitize-report.json +12 -0
  442. package/src/bollharness/reference/boll-reference/scripts/hooks/find-boll-root.sh +27 -0
  443. package/src/bollharness/reference/boll-reference/scripts/hooks/precompact.sh +57 -0
  444. package/src/bollharness/reference/boll-reference/scripts/hooks/stop-evaluator.md +57 -0
  445. package/src/bollharness/schemas/metrics-jsonl-allowlist.json +67 -0
  446. package/src/bollharness/scripts/checks/next_decision_number.sh +48 -0
  447. package/src/bollharness/scripts/ci/count-components.sh +65 -0
  448. package/src/bollharness/scripts/context-fragments/artifact-linkage.md +14 -0
  449. package/src/bollharness/scripts/context-fragments/auth-consumers.md +17 -0
  450. package/src/bollharness/scripts/context-fragments/bridge-constitution.md +13 -0
  451. package/src/bollharness/scripts/context-fragments/catalyst-distributed.md +18 -0
  452. package/src/bollharness/scripts/context-fragments/closure-checklist.md +13 -0
  453. package/src/bollharness/scripts/context-fragments/contract-consumers.md +15 -0
  454. package/src/bollharness/scripts/context-fragments/db-shared-structures.md +15 -0
  455. package/src/bollharness/scripts/context-fragments/fixed-three-layers.md +19 -0
  456. package/src/bollharness/scripts/context-fragments/general-dev-principles.md +11 -0
  457. package/src/bollharness/scripts/context-fragments/issue-first.md +8 -0
  458. package/src/bollharness/scripts/context-fragments/mcp-parity.md +16 -0
  459. package/src/bollharness/scripts/context-fragments/pi-agent-operations.md +74 -0
  460. package/src/bollharness/scripts/context-fragments/protocol-consumers.md +15 -0
  461. package/src/bollharness/scripts/context-fragments/run-events-consumers.md +15 -0
  462. package/src/bollharness/scripts/context-fragments/scene-fidelity.md +13 -0
  463. package/src/bollharness/scripts/context-fragments/truth-source-hierarchy.md +15 -0
  464. package/src/bollharness/scripts/context-fragments/two-language.md +15 -0
  465. package/src/bollharness/scripts/context-fragments/version-sources.md +14 -0
  466. package/src/bollharness/scripts/hooks/find-project-root.sh +47 -0
  467. package/src/bollharness/scripts/hooks/inbox-poll.sh +78 -0
  468. package/src/bollharness/scripts/hooks/precompact.sh +56 -0
  469. package/src/bollharness/scripts/hooks/stop-evaluator.md +83 -0
  470. package/src/bollharness/scripts/sync-from-upstream.sh +281 -0
  471. package/src/bollharness/src/index.ts +5 -0
  472. package/src/bollharness/src/scripts/checks/check_adr_plan_numbering.ts +11 -0
  473. package/src/bollharness/src/scripts/checks/check_api_types.ts +52 -0
  474. package/src/bollharness/src/scripts/checks/check_artifact_link.ts +156 -0
  475. package/src/bollharness/src/scripts/checks/check_bridge_deps.ts +11 -0
  476. package/src/bollharness/src/scripts/checks/check_bugfix_binding.ts +11 -0
  477. package/src/bollharness/src/scripts/checks/check_bugfix_binding_ci.ts +11 -0
  478. package/src/bollharness/src/scripts/checks/check_doc_file_references.ts +11 -0
  479. package/src/bollharness/src/scripts/checks/check_doc_freshness.ts +141 -0
  480. package/src/bollharness/src/scripts/checks/check_doc_links.ts +36 -0
  481. package/src/bollharness/src/scripts/checks/check_file_existence_claims.ts +11 -0
  482. package/src/bollharness/src/scripts/checks/check_fragment_integrity.ts +40 -0
  483. package/src/bollharness/src/scripts/checks/check_hook_installed.ts +70 -0
  484. package/src/bollharness/src/scripts/checks/check_issue_closure.ts +51 -0
  485. package/src/bollharness/src/scripts/checks/check_mcp_parity.ts +11 -0
  486. package/src/bollharness/src/scripts/checks/check_security.ts +54 -0
  487. package/src/bollharness/src/scripts/checks/check_skill_parity.ts +11 -0
  488. package/src/bollharness/src/scripts/checks/check_versions.ts +11 -0
  489. package/src/bollharness/src/scripts/checks/finding.ts +35 -0
  490. package/src/bollharness/src/scripts/checks/next_decision_number.ts +24 -0
  491. package/src/bollharness/src/scripts/checks/regenerate_magic_docs.ts +11 -0
  492. package/src/bollharness/src/scripts/ci/detect_rebaseline_triggers.ts +14 -0
  493. package/src/bollharness/src/scripts/ci/scan_subprocess_cfg.ts +14 -0
  494. package/src/bollharness/src/scripts/ci/scan_verify_artifacts.ts +14 -0
  495. package/src/bollharness/src/scripts/ci/scan_yaml_schema.ts +14 -0
  496. package/src/bollharness/src/scripts/context_router.ts +76 -0
  497. package/src/bollharness/src/scripts/deploy-guard.ts +182 -0
  498. package/src/bollharness/src/scripts/guard-feedback.ts +215 -0
  499. package/src/bollharness/src/scripts/guard_router.ts +194 -0
  500. package/src/bollharness/src/scripts/hooks/_hook_output.js +3 -0
  501. package/src/bollharness/src/scripts/hooks/_hook_output.ts +11 -0
  502. package/src/bollharness/src/scripts/hooks/auto-python3.ts +10 -0
  503. package/src/bollharness/src/scripts/hooks/deploy-progress-on-session-end.ts +10 -0
  504. package/src/bollharness/src/scripts/hooks/failure-analyzer.ts +10 -0
  505. package/src/bollharness/src/scripts/hooks/gate-judgment-inject.ts +111 -0
  506. package/src/bollharness/src/scripts/hooks/gate-transition-judgment.ts +74 -0
  507. package/src/bollharness/src/scripts/hooks/inbox-ack.ts +10 -0
  508. package/src/bollharness/src/scripts/hooks/inbox-inject-on-start.ts +10 -0
  509. package/src/bollharness/src/scripts/hooks/inbox-validate.ts +10 -0
  510. package/src/bollharness/src/scripts/hooks/inbox-write-ledger.ts +10 -0
  511. package/src/bollharness/src/scripts/hooks/initializer-agent.ts +10 -0
  512. package/src/bollharness/src/scripts/hooks/loop-detection.ts +83 -0
  513. package/src/bollharness/src/scripts/hooks/owner-guard.ts +10 -0
  514. package/src/bollharness/src/scripts/hooks/precompact.ts +10 -0
  515. package/src/bollharness/src/scripts/hooks/review-agent-gatekeeper.ts +10 -0
  516. package/src/bollharness/src/scripts/hooks/risk-tracker.ts +121 -0
  517. package/src/bollharness/src/scripts/hooks/sanitize-on-read.ts +10 -0
  518. package/src/bollharness/src/scripts/hooks/session-reflection.ts +12 -0
  519. package/src/bollharness/src/scripts/hooks/session-start-magic-docs.ts +12 -0
  520. package/src/bollharness/src/scripts/hooks/session-start-reset-risk.ts +12 -0
  521. package/src/bollharness/src/scripts/hooks/session-start-toolkit-reminder.ts +12 -0
  522. package/src/bollharness/src/scripts/hooks/stop-evaluator.ts +164 -0
  523. package/src/bollharness/src/scripts/hooks/tool-call-counter.ts +10 -0
  524. package/src/bollharness/src/scripts/hooks/trace-analyzer.ts +14 -0
  525. package/src/bollharness/src/scripts/install/install-trust-token.ts +13 -0
  526. package/src/bollharness/src/scripts/install/multi_project_registry.ts +13 -0
  527. package/src/bollharness/src/scripts/install/phase2_auto.ts +28 -0
  528. package/src/bollharness/src/scripts/install/pre_commit_installer.ts +10 -0
  529. package/src/bollharness/src/scripts/install/tier_selector.ts +10 -0
  530. package/src/bollharness/src/scripts/install/transcript_miner.ts +13 -0
  531. package/src/bollharness/src/scripts/lib/claim_patterns.ts +11 -0
  532. package/src/bollharness/src/scripts/lib/sanitize_patterns.ts +13 -0
  533. package/src/bollharness/src/scripts/sanitize.ts +9 -0
  534. package/src/bollharness/templates/persona/default.json +19 -0
  535. package/src/bollharness/templates/scaffold/.boll/guard/.gitkeep +0 -0
  536. package/src/bollharness/templates/scaffold/.boll/metrics/.gitkeep +0 -0
  537. package/src/bollharness/templates/scaffold/.boll/state/.gitkeep +0 -0
  538. package/src/bollharness/templates/scaffold/.gitignore.append +16 -0
  539. package/src/bollharness/templates/scaffold/CLAUDE.md +89 -0
  540. package/src/bollharness/templates/scaffold/docs/INDEX.md +3 -0
  541. package/src/bollharness/templates/scaffold/docs/decisions/ADR_TEMPLATE.md +38 -0
  542. package/src/bollharness/templates/scaffold/docs/decisions/PLAN_TEMPLATE.md +45 -0
  543. package/src/bollharness/templates/scaffold/docs/decisions/tasks/.gitkeep +2 -0
  544. package/src/bollharness/templates/scaffold/docs/issues/.gitkeep +0 -0
  545. package/src/bollharness/templates/scaffold/docs/issues/GUARD_ISSUE_TEMPLATE.md +35 -0
  546. package/src/bollharness/templates/scaffold/docs/issues/ISSUE_TEMPLATE.md +51 -0
  547. package/src/bollharness/tsconfig.json +26 -0
  548. package/src/bollharness-integration/channel-judgment-engine.ts +634 -0
  549. package/src/bollharness-integration/context-chain-router.ts +474 -0
  550. package/src/bollharness-integration/context-router-judgment.ts +339 -0
  551. package/src/bollharness-integration/context-router.ts +583 -0
  552. package/src/bollharness-integration/gate-state-machine.ts +444 -0
  553. package/src/bollharness-integration/gate-transition-hooks.ts +137 -0
  554. package/src/bollharness-integration/guard-checker.ts +451 -0
  555. package/src/bollharness-integration/index.ts +219 -0
  556. package/src/bollharness-integration/integration.ts +538 -0
  557. package/src/bollharness-integration/judgment-prompts.yaml +535 -0
  558. package/src/bollharness-integration/llm-judgment-engine.ts +712 -0
  559. package/src/bollharness-integration/skill-adapter.ts +646 -0
  560. package/src/cli/interface.ts +211 -0
  561. package/src/constraint-runtime/package-lock.json +48 -0
  562. package/src/constraint-runtime/package.json +34 -0
  563. package/src/constraint-runtime/src/_archive_helper.ts +16 -0
  564. package/src/constraint-runtime/src/agent/coordinator.ts +71 -0
  565. package/src/constraint-runtime/src/agent/index.ts +1 -0
  566. package/src/constraint-runtime/src/assistant/index.ts +15 -0
  567. package/src/constraint-runtime/src/bootstrap/index.ts +15 -0
  568. package/src/constraint-runtime/src/bootstrap_graph.ts +17 -0
  569. package/src/constraint-runtime/src/bridge/index.ts +15 -0
  570. package/src/constraint-runtime/src/buddy/index.ts +15 -0
  571. package/src/constraint-runtime/src/cli/index.ts +15 -0
  572. package/src/constraint-runtime/src/command_graph.ts +20 -0
  573. package/src/constraint-runtime/src/commands.ts +83 -0
  574. package/src/constraint-runtime/src/components/index.ts +15 -0
  575. package/src/constraint-runtime/src/constants/index.ts +15 -0
  576. package/src/constraint-runtime/src/constraint/budget.ts +25 -0
  577. package/src/constraint-runtime/src/constraint/index.ts +3 -0
  578. package/src/constraint-runtime/src/constraint/permission.ts +28 -0
  579. package/src/constraint-runtime/src/context.ts +45 -0
  580. package/src/constraint-runtime/src/coordinator/index.ts +15 -0
  581. package/src/constraint-runtime/src/cost_hook.ts +6 -0
  582. package/src/constraint-runtime/src/cost_tracker.ts +9 -0
  583. package/src/constraint-runtime/src/deferred_init.ts +18 -0
  584. package/src/constraint-runtime/src/direct_modes.ts +13 -0
  585. package/src/constraint-runtime/src/dynamic-tool-loader.ts +115 -0
  586. package/src/constraint-runtime/src/entrypoints/index.ts +15 -0
  587. package/src/constraint-runtime/src/execution_registry.ts +41 -0
  588. package/src/constraint-runtime/src/history.ts +16 -0
  589. package/src/constraint-runtime/src/hooks/index.ts +15 -0
  590. package/src/constraint-runtime/src/index.ts +28 -0
  591. package/src/constraint-runtime/src/ink.ts +4 -0
  592. package/src/constraint-runtime/src/keybindings/index.ts +15 -0
  593. package/src/constraint-runtime/src/memdir/index.ts +15 -0
  594. package/src/constraint-runtime/src/migrations/index.ts +15 -0
  595. package/src/constraint-runtime/src/models.ts +49 -0
  596. package/src/constraint-runtime/src/moreright/index.ts +15 -0
  597. package/src/constraint-runtime/src/native_ts/index.ts +15 -0
  598. package/src/constraint-runtime/src/output_styles/index.ts +15 -0
  599. package/src/constraint-runtime/src/parity_audit.ts +23 -0
  600. package/src/constraint-runtime/src/plugins/index.ts +15 -0
  601. package/src/constraint-runtime/src/port_manifest.ts +20 -0
  602. package/src/constraint-runtime/src/prefetch.ts +17 -0
  603. package/src/constraint-runtime/src/query.ts +7 -0
  604. package/src/constraint-runtime/src/reference_data/archive_surface_snapshot.json +63 -0
  605. package/src/constraint-runtime/src/reference_data/commands_snapshot.json +1037 -0
  606. package/src/constraint-runtime/src/reference_data/subsystems/OpenCLI.json +10 -0
  607. package/src/constraint-runtime/src/reference_data/subsystems/PolymarketSDK.json +12 -0
  608. package/src/constraint-runtime/src/reference_data/subsystems/SafeSDK.json +14 -0
  609. package/src/constraint-runtime/src/reference_data/subsystems/assistant.json +8 -0
  610. package/src/constraint-runtime/src/reference_data/subsystems/bootstrap.json +8 -0
  611. package/src/constraint-runtime/src/reference_data/subsystems/bridge.json +32 -0
  612. package/src/constraint-runtime/src/reference_data/subsystems/buddy.json +13 -0
  613. package/src/constraint-runtime/src/reference_data/subsystems/cli.json +26 -0
  614. package/src/constraint-runtime/src/reference_data/subsystems/components.json +32 -0
  615. package/src/constraint-runtime/src/reference_data/subsystems/constants.json +28 -0
  616. package/src/constraint-runtime/src/reference_data/subsystems/coordinator.json +8 -0
  617. package/src/constraint-runtime/src/reference_data/subsystems/entrypoints.json +15 -0
  618. package/src/constraint-runtime/src/reference_data/subsystems/hooks.json +32 -0
  619. package/src/constraint-runtime/src/reference_data/subsystems/keybindings.json +21 -0
  620. package/src/constraint-runtime/src/reference_data/subsystems/memdir.json +15 -0
  621. package/src/constraint-runtime/src/reference_data/subsystems/migrations.json +18 -0
  622. package/src/constraint-runtime/src/reference_data/subsystems/moreright.json +8 -0
  623. package/src/constraint-runtime/src/reference_data/subsystems/native_ts.json +11 -0
  624. package/src/constraint-runtime/src/reference_data/subsystems/outputStyles.json +8 -0
  625. package/src/constraint-runtime/src/reference_data/subsystems/plugins.json +9 -0
  626. package/src/constraint-runtime/src/reference_data/subsystems/remote.json +11 -0
  627. package/src/constraint-runtime/src/reference_data/subsystems/schemas.json +8 -0
  628. package/src/constraint-runtime/src/reference_data/subsystems/screens.json +10 -0
  629. package/src/constraint-runtime/src/reference_data/subsystems/server.json +10 -0
  630. package/src/constraint-runtime/src/reference_data/subsystems/services.json +32 -0
  631. package/src/constraint-runtime/src/reference_data/subsystems/skills.json +27 -0
  632. package/src/constraint-runtime/src/reference_data/subsystems/state.json +13 -0
  633. package/src/constraint-runtime/src/reference_data/subsystems/types.json +18 -0
  634. package/src/constraint-runtime/src/reference_data/subsystems/upstreamproxy.json +9 -0
  635. package/src/constraint-runtime/src/reference_data/subsystems/utils.json +32 -0
  636. package/src/constraint-runtime/src/reference_data/subsystems/vim.json +12 -0
  637. package/src/constraint-runtime/src/reference_data/subsystems/voice.json +8 -0
  638. package/src/constraint-runtime/src/reference_data/tools_snapshot.json +1042 -0
  639. package/src/constraint-runtime/src/remote/index.ts +15 -0
  640. package/src/constraint-runtime/src/remote_runtime.ts +17 -0
  641. package/src/constraint-runtime/src/runtime/index.ts +1 -0
  642. package/src/constraint-runtime/src/runtime/session.ts +42 -0
  643. package/src/constraint-runtime/src/schemas/index.ts +15 -0
  644. package/src/constraint-runtime/src/screens/index.ts +15 -0
  645. package/src/constraint-runtime/src/server/index.ts +15 -0
  646. package/src/constraint-runtime/src/services/index.ts +15 -0
  647. package/src/constraint-runtime/src/session_store.ts +32 -0
  648. package/src/constraint-runtime/src/setup.ts +50 -0
  649. package/src/constraint-runtime/src/skills/index.ts +1 -0
  650. package/src/constraint-runtime/src/skills/skill-registry.ts +40 -0
  651. package/src/constraint-runtime/src/state/index.ts +15 -0
  652. package/src/constraint-runtime/src/system_init.ts +21 -0
  653. package/src/constraint-runtime/src/thinking/engine.ts +61 -0
  654. package/src/constraint-runtime/src/thinking/index.ts +1 -0
  655. package/src/constraint-runtime/src/tool_pool.ts +20 -0
  656. package/src/constraint-runtime/src/tools/OpenCLI/execAdapter.ts +12 -0
  657. package/src/constraint-runtime/src/tools/OpenCLI/listAdapters.ts +12 -0
  658. package/src/constraint-runtime/src/tools/OpenCLI/runCommand.ts +13 -0
  659. package/src/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.ts +10 -0
  660. package/src/constraint-runtime/src/tools/PolymarketSDK/createOrder.ts +13 -0
  661. package/src/constraint-runtime/src/tools/PolymarketSDK/getMarket.ts +14 -0
  662. package/src/constraint-runtime/src/tools/PolymarketSDK/getOrders.ts +10 -0
  663. package/src/constraint-runtime/src/tools/PolymarketSDK/listMarkets.ts +24 -0
  664. package/src/constraint-runtime/src/tools/SafeSDK/confirmTransaction.ts +13 -0
  665. package/src/constraint-runtime/src/tools/SafeSDK/createTransaction.ts +23 -0
  666. package/src/constraint-runtime/src/tools/SafeSDK/deploySafe.ts +12 -0
  667. package/src/constraint-runtime/src/tools/SafeSDK/executeTransaction.ts +12 -0
  668. package/src/constraint-runtime/src/tools/SafeSDK/getBalance.ts +10 -0
  669. package/src/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.ts +10 -0
  670. package/src/constraint-runtime/src/tools/SafeSDK/proposeTransaction.ts +14 -0
  671. package/src/constraint-runtime/src/tools/WalletTools/autoPay.ts +58 -0
  672. package/src/constraint-runtime/src/tools/WalletTools/createWallet.ts +19 -0
  673. package/src/constraint-runtime/src/tools/WalletTools/getBalance.ts +28 -0
  674. package/src/constraint-runtime/src/tools/WalletTools/importWallet.ts +34 -0
  675. package/src/constraint-runtime/src/tools/WalletTools/sendTransaction.ts +50 -0
  676. package/src/constraint-runtime/src/tools/WalletTools/signMessage.ts +23 -0
  677. package/src/constraint-runtime/src/tools/WalletTools/transferToken.ts +49 -0
  678. package/src/constraint-runtime/src/tools.ts +100 -0
  679. package/src/constraint-runtime/src/transcript.ts +23 -0
  680. package/src/constraint-runtime/src/types/index.ts +15 -0
  681. package/src/constraint-runtime/src/upstream_proxy/index.ts +15 -0
  682. package/src/constraint-runtime/src/utils/index.ts +15 -0
  683. package/src/constraint-runtime/src/vim/index.ts +15 -0
  684. package/src/constraint-runtime/src/voice/index.ts +15 -0
  685. package/src/constraint-runtime/tests/agent.test.ts +20 -0
  686. package/src/constraint-runtime/tests/constraint.test.ts +47 -0
  687. package/src/constraint-runtime/tests/skill.test.ts +23 -0
  688. package/src/constraint-runtime/tests/thinking.test.ts +28 -0
  689. package/src/constraint-runtime/tsconfig.json +13 -0
  690. package/src/constraints/index.ts +6 -0
  691. package/src/documents/reader.ts +80 -0
  692. package/src/electron-preload.ts +25 -0
  693. package/src/electron.ts +200 -0
  694. package/src/index.ts +1606 -0
  695. package/src/llm/config-store.ts +312 -0
  696. package/src/llm/llm-judgment-client.ts +470 -0
  697. package/src/llm/pi-ai.ts +522 -0
  698. package/src/network/agent-network.ts +800 -0
  699. package/src/network/hybrid-messenger.ts +199 -0
  700. package/src/network/iroh-bootstrap.ts +57 -0
  701. package/src/network/iroh-discovery.ts +207 -0
  702. package/src/network/iroh-integration.ts +158 -0
  703. package/src/network/iroh-transport.ts +594 -0
  704. package/src/network/p2p.ts +963 -0
  705. package/src/network/storage/adapters/json-adapter.ts +439 -0
  706. package/src/network/storage/index.ts +187 -0
  707. package/src/network/storage/types.ts +166 -0
  708. package/src/pi-ecosystem/index.ts +453 -0
  709. package/src/pi-ecosystem-colony/index.ts +482 -0
  710. package/src/pi-ecosystem-goals/index.ts +585 -0
  711. package/src/pi-ecosystem-judgment/decision.ts +431 -0
  712. package/src/pi-ecosystem-judgment/distillation.ts +398 -0
  713. package/src/pi-ecosystem-judgment/human-value-store.ts +580 -0
  714. package/src/pi-ecosystem-judgment/index.ts +678 -0
  715. package/src/pi-ecosystem-judgment/value-injection.ts +744 -0
  716. package/src/pi-ecosystem-mcp/index.ts +427 -0
  717. package/src/pi-ecosystem-subagents/index.ts +408 -0
  718. package/src/social/ant-colony/AdaptiveHeartbeat.ts +131 -0
  719. package/src/social/ant-colony/PheromoneEngine.ts +302 -0
  720. package/src/social/ant-colony/index.ts +18 -0
  721. package/src/social/ant-colony/types.ts +94 -0
  722. package/src/social/channels/ChannelManager.ts +485 -0
  723. package/src/social/channels/DiapChannelBridge.ts +501 -0
  724. package/src/social/channels/InterestMatcher.ts +189 -0
  725. package/src/social/channels/agent-workflow-config.json +214 -0
  726. package/src/social/channels/agent-workflow-config.yaml +334 -0
  727. package/src/social/channels/channel-agent-session.ts +407 -0
  728. package/src/social/channels/channel-heartbeat-agent.ts +622 -0
  729. package/src/social/channels/diap-doc-parser.ts +282 -0
  730. package/src/social/channels/harness-workflow-integrator.ts +594 -0
  731. package/src/social/channels/index.ts +22 -0
  732. package/src/social/channels/types.ts +115 -0
  733. package/src/social/global-shared-context.ts +506 -0
  734. package/src/social/heartbeat.ts +1041 -0
  735. package/src/social/persona/enhanced-persona.ts +359 -0
  736. package/src/test/ai-judgment-test.ts +92 -0
  737. package/src/test/bollharness-integration.test.ts +398 -0
  738. package/src/test/channel-agent-multi-dialogue.ts +265 -0
  739. package/src/test/channel-heartbeat-agent-test.ts +244 -0
  740. package/src/test/constraint-layer.test.ts +191 -0
  741. package/src/test/diap-identity-test.ts +222 -0
  742. package/src/test/diap-quick-test.ts +73 -0
  743. package/src/test/global-shared-context.test.ts +393 -0
  744. package/src/test/harness-judgment-injection.test.ts +353 -0
  745. package/src/test/harness-workflow-integrator-test.ts +285 -0
  746. package/src/test/human-value-store.test.ts +316 -0
  747. package/src/test/hybrid-integration-test.ts +126 -0
  748. package/src/test/hybrid-messenger-verify.ts +68 -0
  749. package/src/test/iroh-bistream-debug.ts +50 -0
  750. package/src/test/iroh-communication.test.ts +81 -0
  751. package/src/test/iroh-debug-test.ts +69 -0
  752. package/src/test/iroh-diap-test.ts +90 -0
  753. package/src/test/iroh-direct-connect.ts +65 -0
  754. package/src/test/iroh-e2e-fixed.ts +106 -0
  755. package/src/test/iroh-e2e-same-process.ts +83 -0
  756. package/src/test/iroh-e2e.ts +83 -0
  757. package/src/test/iroh-final-e2e.ts +84 -0
  758. package/src/test/iroh-relay-test.ts +46 -0
  759. package/src/test/iroh-simple-test.ts +49 -0
  760. package/src/test/iroh-transport-verify.ts +60 -0
  761. package/src/test/iroh-transport.test.ts +47 -0
  762. package/src/test/iroh-two-nodes.ts +87 -0
  763. package/src/test/iroh-verify.ts +55 -0
  764. package/src/test/judgment-decision.test.ts +373 -0
  765. package/src/test/llm-judgment-integration.test.ts +257 -0
  766. package/src/test/p2p-agent-complex-dialogue.ts +490 -0
  767. package/src/test/p2p-agent-dialogue.ts +423 -0
  768. package/src/test/p2p-agent-full-bidirectional.ts +686 -0
  769. package/src/test/p2p-agent-harness-flow.ts +562 -0
  770. package/src/test/p2p-agent-harness-single.ts +175 -0
  771. package/src/test/p2p-ai-dialogue-test.ts +374 -0
  772. package/src/test/p2p-cid-connect-test.ts +245 -0
  773. package/src/test/p2p-connect-receiver.ts +85 -0
  774. package/src/test/p2p-iroh-test.ts +214 -0
  775. package/src/test/p2p-minimal-test.ts +264 -0
  776. package/src/test/p2p-node-1.ts +172 -0
  777. package/src/test/p2p-node-2.ts +172 -0
  778. package/src/test/p2p-server.ts +335 -0
  779. package/src/test/p2p-two-nodes-test.ts +542 -0
  780. package/src/test/pi-sdk.test.ts +47 -0
  781. package/src/test/set-persona.ts +56 -0
  782. package/src/test/simple.test.ts +11 -0
  783. package/src/test/storage-integration.test.ts +191 -0
  784. package/src/test/subagent-manager.test.ts +392 -0
  785. package/src/test/test-gate-flow.test.ts +92 -0
  786. package/src/test/workflow-engine.test.ts +101 -0
  787. package/src/web/api-config.html +265 -0
  788. package/src/web/client.js +1401 -0
  789. package/src/web/components/p2p/P2PModal.tsx +328 -0
  790. package/src/web/components/p2p/index.ts +404 -0
  791. package/src/web/components/p2p/index.tsx +297 -0
  792. package/src/web/components/p2p/p2p-connection.ts +186 -0
  793. package/src/web/components/p2p/p2p-identity.ts +92 -0
  794. package/src/web/components/p2p/p2p-manager.ts +109 -0
  795. package/src/web/components/p2p/p2p-messages.ts +219 -0
  796. package/src/web/components/p2p/p2p-modal.ts +685 -0
  797. package/src/web/components/p2p/p2p-store-memory.ts +162 -0
  798. package/src/web/components/p2p/types.ts +112 -0
  799. package/src/web/design.md +99 -0
  800. package/src/web/index.html +192 -0
  801. package/src/web/server.ts +1878 -0
  802. package/src/web/style.css +3260 -0
  803. package/src/workflows/collaboration.ts +455 -0
  804. package/src/workflows/index.ts +64 -0
  805. package/tsconfig.electron.json +20 -0
  806. package/tsconfig.json +19 -0
  807. package/vitest.config.ts +12 -0
  808. package//346/203/263/346/263/225.md +79 -0
@@ -0,0 +1,3260 @@
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;
265
+ display: flex;
266
+ flex-direction: column;
267
+ overflow: hidden;
268
+ padding: 16px;
269
+ }
270
+
271
+ .section-header {
272
+ display: flex;
273
+ align-items: center;
274
+ justify-content: space-between;
275
+ margin-bottom: 12px;
276
+ }
277
+
278
+ .section-title {
279
+ font-size: 11px;
280
+ font-weight: 600;
281
+ text-transform: uppercase;
282
+ letter-spacing: 0.5px;
283
+ color: var(--text-muted);
284
+ }
285
+
286
+ .section-header {
287
+ margin-bottom: 8px;
288
+ }
289
+
290
+ .section-action {
291
+ width: 100%;
292
+ height: 36px;
293
+ border-radius: 10px;
294
+ background: var(--accent);
295
+ border: none;
296
+ color: var(--bg);
297
+ cursor: pointer;
298
+ display: flex;
299
+ align-items: center;
300
+ justify-content: center;
301
+ gap: 8px;
302
+ font-size: 13px;
303
+ font-weight: 600;
304
+ font-family: inherit;
305
+ letter-spacing: 0.5px;
306
+ transition: var(--transition);
307
+ box-shadow: 0 2px 8px var(--accent-glow);
308
+ }
309
+
310
+ .section-action svg {
311
+ width: 16px;
312
+ height: 16px;
313
+ }
314
+
315
+ .section-action:hover {
316
+ background: var(--accent-hover);
317
+ box-shadow: 0 4px 16px var(--accent-glow);
318
+ transform: translateY(-1px);
319
+ }
320
+
321
+ .section-action:active {
322
+ transform: translateY(0);
323
+ box-shadow: 0 1px 4px var(--accent-glow);
324
+ }
325
+
326
+ /* New Channel Form */
327
+ .new-channel-form {
328
+ margin-bottom: 12px;
329
+ margin-top: 12px;
330
+ }
331
+
332
+ .new-channel-form input {
333
+ width: 100%;
334
+ padding: 10px 12px;
335
+ background: var(--bg);
336
+ border: 1px solid var(--border);
337
+ border-radius: var(--radius-sm);
338
+ color: var(--text);
339
+ font-size: 14px;
340
+ outline: none;
341
+ transition: var(--transition);
342
+ }
343
+
344
+ .new-channel-form input:focus {
345
+ border-color: var(--accent);
346
+ box-shadow: 0 0 0 3px var(--accent-glow);
347
+ }
348
+
349
+ .new-channel-form input::placeholder {
350
+ color: var(--text-muted);
351
+ }
352
+
353
+ /* Channel List */
354
+ .channel-list {
355
+ list-style: none;
356
+ flex: 1;
357
+ overflow-y: auto;
358
+ display: flex;
359
+ flex-direction: column;
360
+ gap: 4px;
361
+ }
362
+
363
+ .channel-list::-webkit-scrollbar {
364
+ width: 4px;
365
+ }
366
+
367
+ .channel-list::-webkit-scrollbar-track {
368
+ background: transparent;
369
+ }
370
+
371
+ .channel-list::-webkit-scrollbar-thumb {
372
+ background: var(--border);
373
+ border-radius: 2px;
374
+ }
375
+
376
+ .channel-item {
377
+ display: flex;
378
+ align-items: center;
379
+ padding: 10px 12px;
380
+ border-radius: var(--radius-sm);
381
+ cursor: pointer;
382
+ transition: var(--transition);
383
+ gap: 10px;
384
+ }
385
+
386
+ .channel-item:hover {
387
+ background: var(--bg-hover);
388
+ }
389
+
390
+ .channel-item.active {
391
+ background: var(--bg-active);
392
+ border: 1px solid var(--border-light);
393
+ }
394
+
395
+ .channel-item.active .channel-name {
396
+ color: var(--accent);
397
+ font-weight: 500;
398
+ }
399
+
400
+ .channel-icon {
401
+ width: 28px;
402
+ height: 28px;
403
+ border-radius: 8px;
404
+ background: var(--bg);
405
+ border: 1px solid var(--border);
406
+ display: flex;
407
+ align-items: center;
408
+ justify-content: center;
409
+ font-size: 14px;
410
+ flex-shrink: 0;
411
+ }
412
+
413
+ .channel-item.active .channel-icon {
414
+ background: var(--accent);
415
+ border-color: var(--accent);
416
+ }
417
+
418
+ .channel-name {
419
+ flex: 1;
420
+ font-size: 14px;
421
+ color: var(--text);
422
+ white-space: nowrap;
423
+ overflow: hidden;
424
+ text-overflow: ellipsis;
425
+ }
426
+
427
+ .channel-delete {
428
+ width: 24px;
429
+ height: 24px;
430
+ border-radius: 6px;
431
+ background: transparent;
432
+ border: none;
433
+ color: var(--text-muted);
434
+ cursor: pointer;
435
+ display: flex;
436
+ align-items: center;
437
+ justify-content: center;
438
+ opacity: 0;
439
+ transition: var(--transition);
440
+ font-size: 16px;
441
+ }
442
+
443
+ .channel-item:hover .channel-delete {
444
+ opacity: 1;
445
+ }
446
+
447
+ .channel-delete:hover {
448
+ background: var(--error-bg);
449
+ color: var(--error);
450
+ }
451
+
452
+ /* Sidebar Footer */
453
+ .sidebar-footer {
454
+ padding: 16px;
455
+ border-top: 1px solid var(--border);
456
+ }
457
+
458
+ .agent-status {
459
+ display: flex;
460
+ align-items: center;
461
+ gap: 8px;
462
+ font-size: 12px;
463
+ color: var(--text-secondary);
464
+ }
465
+
466
+ .status-dot {
467
+ width: 8px;
468
+ height: 8px;
469
+ border-radius: 50%;
470
+ background: var(--accent);
471
+ box-shadow: 0 0 6px var(--accent-glow);
472
+ animation: pulse 2s infinite;
473
+ }
474
+
475
+ @keyframes pulse {
476
+ 0%, 100% { opacity: 1; }
477
+ 50% { opacity: 0.5; }
478
+ }
479
+
480
+ /* Main */
481
+ .main {
482
+ flex: 1;
483
+ display: flex;
484
+ flex-direction: column;
485
+ height: 100vh;
486
+ overflow: hidden;
487
+ background: var(--bg-main);
488
+ }
489
+
490
+ /* Header */
491
+ .header {
492
+ height: var(--header-height);
493
+ padding: 0 24px;
494
+ border-bottom: 1px solid var(--border);
495
+ display: flex;
496
+ align-items: center;
497
+ justify-content: space-between;
498
+ flex-shrink: 0;
499
+ background: var(--bg-sidebar);
500
+ }
501
+
502
+ .header-left {
503
+ display: flex;
504
+ align-items: center;
505
+ gap: 16px;
506
+ }
507
+
508
+ .channel-indicator {
509
+ width: 12px;
510
+ height: 12px;
511
+ border-radius: 50%;
512
+ background: var(--accent);
513
+ box-shadow: 0 0 12px var(--accent-glow);
514
+ }
515
+
516
+ .header h1 {
517
+ font-family: 'JetBrains Mono', monospace;
518
+ font-size: 18px;
519
+ font-weight: 600;
520
+ color: var(--text);
521
+ }
522
+
523
+ .header-right {
524
+ display: flex;
525
+ align-items: center;
526
+ gap: 12px;
527
+ }
528
+
529
+ .theme-toggle {
530
+ width: 40px;
531
+ height: 40px;
532
+ border-radius: var(--radius-sm);
533
+ background: var(--bg);
534
+ border: 1px solid var(--border);
535
+ color: var(--text-secondary);
536
+ cursor: pointer;
537
+ display: flex;
538
+ align-items: center;
539
+ justify-content: center;
540
+ transition: var(--transition);
541
+ }
542
+
543
+ .header-action {
544
+ width: 40px;
545
+ height: 40px;
546
+ border-radius: var(--radius-sm);
547
+ background: var(--bg);
548
+ border: 1px solid var(--border);
549
+ color: var(--text-secondary);
550
+ cursor: pointer;
551
+ display: flex;
552
+ align-items: center;
553
+ justify-content: center;
554
+ transition: var(--transition);
555
+ }
556
+
557
+ .header-action:hover {
558
+ background: var(--bg-hover);
559
+ color: var(--accent);
560
+ border-color: var(--accent);
561
+ }
562
+
563
+ .theme-toggle:hover {
564
+ background: var(--bg-hover);
565
+ color: var(--accent);
566
+ border-color: var(--accent);
567
+ }
568
+
569
+ [data-theme="dark"] .sun-icon { display: block; }
570
+ [data-theme="dark"] .moon-icon { display: none; }
571
+ [data-theme="light"] .sun-icon { display: none; }
572
+ [data-theme="light"] .moon-icon { display: block; }
573
+
574
+ /* Messages */
575
+ .messages {
576
+ flex: 1;
577
+ overflow-y: auto;
578
+ padding: 24px;
579
+ display: flex;
580
+ flex-direction: column;
581
+ gap: 20px;
582
+ }
583
+
584
+ .messages::-webkit-scrollbar {
585
+ width: 6px;
586
+ }
587
+
588
+ .messages::-webkit-scrollbar-track {
589
+ background: transparent;
590
+ }
591
+
592
+ .messages::-webkit-scrollbar-thumb {
593
+ background: var(--border);
594
+ border-radius: 3px;
595
+ }
596
+
597
+ .message {
598
+ display: flex;
599
+ flex-direction: column;
600
+ max-width: 85%;
601
+ animation: messageIn 0.3s ease-out;
602
+ }
603
+
604
+ @keyframes messageIn {
605
+ from {
606
+ opacity: 0;
607
+ transform: translateY(10px);
608
+ }
609
+ to {
610
+ opacity: 1;
611
+ transform: translateY(0);
612
+ }
613
+ }
614
+
615
+ .message-user {
616
+ align-self: flex-end;
617
+ }
618
+
619
+ .message-ai {
620
+ align-self: flex-start;
621
+ }
622
+
623
+ .bubble {
624
+ padding: 14px 18px;
625
+ border-radius: var(--radius);
626
+ line-height: 1.6;
627
+ white-space: pre-wrap;
628
+ word-break: break-word;
629
+ font-size: 15px;
630
+ }
631
+
632
+ .bubble-user {
633
+ background: var(--user-bg);
634
+ color: var(--user-text);
635
+ border-bottom-right-radius: 4px;
636
+ box-shadow: 3px 3px 0px var(--accent-dark);
637
+ }
638
+
639
+ .bubble-ai {
640
+ background: var(--ai-bg);
641
+ color: var(--ai-text);
642
+ border: 1px solid var(--border);
643
+ border-bottom-left-radius: 4px;
644
+ }
645
+
646
+ .message-header {
647
+ font-family: 'JetBrains Mono', monospace;
648
+ font-size: 12px;
649
+ font-weight: 600;
650
+ color: var(--accent);
651
+ margin-bottom: 8px;
652
+ padding: 0 4px;
653
+ }
654
+
655
+ .environment-details {
656
+ font-family: 'JetBrains Mono', monospace;
657
+ font-size: 11px;
658
+ color: var(--text-secondary);
659
+ background: var(--bg);
660
+ border: 1px solid var(--border);
661
+ border-radius: var(--radius-sm);
662
+ padding: 8px 12px;
663
+ margin-bottom: 10px;
664
+ white-space: pre-wrap;
665
+ overflow-x: auto;
666
+ }
667
+
668
+ .env-container {
669
+ margin-bottom: 8px;
670
+ }
671
+
672
+ .env-toggle {
673
+ font-family: 'JetBrains Mono', monospace;
674
+ font-size: 11px;
675
+ color: var(--text-muted);
676
+ background: var(--bg);
677
+ border: 1px solid var(--border);
678
+ border-radius: var(--radius-sm);
679
+ padding: 4px 10px;
680
+ cursor: pointer;
681
+ display: inline-flex;
682
+ align-items: center;
683
+ gap: 6px;
684
+ margin-bottom: 6px;
685
+ transition: var(--transition);
686
+ }
687
+
688
+ .env-toggle:hover {
689
+ border-color: var(--accent);
690
+ color: var(--text-secondary);
691
+ }
692
+
693
+ .env-arrow {
694
+ font-size: 10px;
695
+ transition: transform 0.2s;
696
+ }
697
+
698
+ .env-container .environment-details {
699
+ margin-bottom: 0;
700
+ }
701
+
702
+ .env-container .environment-details pre {
703
+ margin: 0;
704
+ white-space: pre-wrap;
705
+ word-break: break-all;
706
+ }
707
+
708
+ /* Thinking Process (思维链) */
709
+ .think-container {
710
+ margin-bottom: 10px;
711
+ }
712
+
713
+ .think-toggle {
714
+ font-family: 'JetBrains Mono', monospace;
715
+ font-size: 11px;
716
+ color: var(--text-muted);
717
+ background: var(--bg);
718
+ border: 1px solid var(--border);
719
+ border-radius: var(--radius-sm);
720
+ padding: 4px 10px;
721
+ cursor: pointer;
722
+ display: inline-flex;
723
+ align-items: center;
724
+ gap: 6px;
725
+ margin-bottom: 6px;
726
+ transition: var(--transition);
727
+ }
728
+
729
+ .think-toggle:hover {
730
+ border-color: var(--accent);
731
+ color: var(--text-secondary);
732
+ }
733
+
734
+ .think-arrow {
735
+ font-size: 10px;
736
+ transition: transform 0.2s;
737
+ }
738
+
739
+ .think-content {
740
+ font-family: 'JetBrains Mono', monospace;
741
+ font-size: 11px;
742
+ color: var(--text-secondary);
743
+ background: var(--bg);
744
+ border: 1px solid var(--border);
745
+ border-radius: var(--radius-sm);
746
+ padding: 8px 12px;
747
+ margin-bottom: 10px;
748
+ white-space: pre-wrap;
749
+ overflow-x: auto;
750
+ }
751
+
752
+ .think-content pre {
753
+ margin: 0;
754
+ white-space: pre-wrap;
755
+ word-break: break-all;
756
+ }
757
+
758
+ .time {
759
+ font-size: 11px;
760
+ color: var(--text-muted);
761
+ margin-top: 6px;
762
+ padding: 0 4px;
763
+ }
764
+
765
+ .message-user .time {
766
+ text-align: right;
767
+ }
768
+
769
+ /* Message Actions (消息操作按钮) */
770
+ .message-actions {
771
+ display: flex;
772
+ gap: 6px;
773
+ margin-top: 8px;
774
+ padding: 0 4px;
775
+ }
776
+
777
+ .message-user .message-actions {
778
+ justify-content: flex-end;
779
+ }
780
+
781
+ .action-btn {
782
+ display: inline-flex;
783
+ align-items: center;
784
+ gap: 4px;
785
+ padding: 4px 10px;
786
+ font-size: 11px;
787
+ font-family: 'JetBrains Mono', monospace;
788
+ color: var(--text-muted);
789
+ background: var(--bg);
790
+ border: 1px solid var(--border);
791
+ border-radius: var(--radius-sm);
792
+ cursor: pointer;
793
+ transition: var(--transition);
794
+ }
795
+
796
+ .action-btn:hover {
797
+ color: var(--accent);
798
+ border-color: var(--accent);
799
+ background: var(--bg-secondary);
800
+ }
801
+
802
+ .action-btn:disabled {
803
+ opacity: 0.6;
804
+ cursor: not-allowed;
805
+ }
806
+
807
+ .copy-btn:hover {
808
+ color: var(--success);
809
+ border-color: var(--success);
810
+ }
811
+
812
+ .regenerate-btn:hover {
813
+ color: var(--info);
814
+ border-color: var(--info);
815
+ }
816
+
817
+ @keyframes spin {
818
+ from { transform: rotate(0deg); }
819
+ to { transform: rotate(360deg); }
820
+ }
821
+
822
+ .spin {
823
+ animation: spin 1s linear infinite;
824
+ }
825
+
826
+ /* Markdown Styles */
827
+ .bubble {
828
+ line-height: 1.7;
829
+ }
830
+
831
+ .bubble h1, .bubble h2, .bubble h3, .bubble h4, .bubble h5, .bubble h6 {
832
+ margin-top: 16px;
833
+ margin-bottom: 8px;
834
+ font-weight: 600;
835
+ }
836
+
837
+ .bubble h1 { font-size: 1.5em; }
838
+ .bubble h2 { font-size: 1.3em; }
839
+ .bubble h3 { font-size: 1.15em; }
840
+
841
+ .bubble p {
842
+ margin: 8px 0;
843
+ }
844
+
845
+ .bubble ul, .bubble ol {
846
+ margin: 8px 0;
847
+ padding-left: 24px;
848
+ }
849
+
850
+ .bubble li {
851
+ margin: 4px 0;
852
+ }
853
+
854
+ .bubble code {
855
+ font-family: 'JetBrains Mono', monospace;
856
+ font-size: 0.9em;
857
+ background: var(--bg);
858
+ padding: 2px 6px;
859
+ border-radius: 4px;
860
+ }
861
+
862
+ .bubble pre {
863
+ background: var(--bg);
864
+ border: 1px solid var(--border);
865
+ border-radius: var(--radius-sm);
866
+ padding: 12px;
867
+ margin: 10px 0;
868
+ overflow-x: auto;
869
+ }
870
+
871
+ .bubble pre code {
872
+ background: none;
873
+ padding: 0;
874
+ }
875
+
876
+ .bubble blockquote {
877
+ border-left: 3px solid var(--accent);
878
+ margin: 10px 0;
879
+ padding-left: 12px;
880
+ color: var(--text-secondary);
881
+ }
882
+
883
+ .bubble table {
884
+ border-collapse: collapse;
885
+ margin: 10px 0;
886
+ width: 100%;
887
+ }
888
+
889
+ .bubble th, .bubble td {
890
+ border: 1px solid var(--border);
891
+ padding: 8px 12px;
892
+ text-align: left;
893
+ }
894
+
895
+ .bubble th {
896
+ background: var(--bg);
897
+ font-weight: 600;
898
+ }
899
+
900
+ .bubble a {
901
+ color: var(--accent);
902
+ text-decoration: none;
903
+ }
904
+
905
+ .bubble a:hover {
906
+ text-decoration: underline;
907
+ }
908
+
909
+ .bubble img {
910
+ max-width: 100%;
911
+ border-radius: var(--radius-sm);
912
+ }
913
+ .workflow-display {
914
+ background: var(--bg-secondary);
915
+ border: 1px solid var(--accent);
916
+ border-radius: var(--radius);
917
+ padding: 12px 16px;
918
+ margin: 8px 0;
919
+ animation: fadeIn 0.3s ease;
920
+ }
921
+
922
+ .workflow-header {
923
+ display: flex;
924
+ align-items: center;
925
+ gap: 10px;
926
+ margin-bottom: 12px;
927
+ padding-bottom: 8px;
928
+ border-bottom: 1px solid var(--border);
929
+ }
930
+
931
+ .workflow-icon {
932
+ font-size: 18px;
933
+ animation: pulse 1.5s infinite;
934
+ }
935
+
936
+ .workflow-title {
937
+ font-size: 14px;
938
+ font-weight: 500;
939
+ color: var(--text-primary);
940
+ }
941
+
942
+ .workflow-loop-count {
943
+ font-size: 12px;
944
+ color: var(--accent);
945
+ background: var(--bg-tertiary);
946
+ padding: 2px 8px;
947
+ border-radius: 10px;
948
+ display: none;
949
+ }
950
+
951
+ .workflow-steps-list {
952
+ margin-bottom: 10px;
953
+ }
954
+
955
+ .workflow-step-item {
956
+ display: flex;
957
+ align-items: center;
958
+ gap: 8px;
959
+ font-size: 13px;
960
+ color: var(--text-secondary);
961
+ padding: 4px 0;
962
+ }
963
+
964
+ .step-running {
965
+ animation: spin 1s linear infinite;
966
+ color: var(--accent);
967
+ }
968
+
969
+ .workflow-streams {
970
+ max-height: 200px;
971
+ overflow-y: auto;
972
+ }
973
+
974
+ .workflow-step-stream {
975
+ background: var(--bg);
976
+ border: 1px solid var(--border);
977
+ border-radius: var(--radius-sm);
978
+ padding: 8px 12px;
979
+ margin-bottom: 8px;
980
+ }
981
+
982
+ .workflow-step-stream .step-label {
983
+ font-size: 12px;
984
+ color: var(--accent);
985
+ margin-bottom: 4px;
986
+ }
987
+
988
+ .workflow-step-stream .step-content {
989
+ font-size: 13px;
990
+ color: var(--text-secondary);
991
+ white-space: pre-wrap;
992
+ }
993
+
994
+ .workflow-loop-item {
995
+ background: linear-gradient(135deg, var(--bg) 0%, var(--bg-tertiary) 100%);
996
+ border: 1px solid var(--accent);
997
+ border-radius: var(--radius-sm);
998
+ padding: 10px 14px;
999
+ margin-bottom: 8px;
1000
+ animation: slideIn 0.3s ease;
1001
+ }
1002
+
1003
+ /* User Command Display - inside message div */
1004
+ .message-user .user-command-display {
1005
+ background: linear-gradient(135deg, var(--bg) 0%, var(--bg-tertiary) 100%);
1006
+ border-left: 3px solid var(--accent);
1007
+ border-radius: var(--radius-sm);
1008
+ padding: 10px 14px;
1009
+ margin: 0;
1010
+ animation: slideIn 0.3s ease;
1011
+ }
1012
+
1013
+ .message-user .user-command-display .command-prompt {
1014
+ display: flex;
1015
+ align-items: flex-start;
1016
+ gap: 10px;
1017
+ }
1018
+
1019
+ .message-user .user-command-display .prompt-icon {
1020
+ color: var(--accent);
1021
+ font-size: 18px;
1022
+ font-weight: bold;
1023
+ line-height: 1.4;
1024
+ }
1025
+
1026
+ .message-user .user-command-display .prompt-text {
1027
+ font-family: 'JetBrains Mono', monospace;
1028
+ font-size: 13px;
1029
+ color: var(--text-primary);
1030
+ background: var(--bg);
1031
+ padding: 6px 10px;
1032
+ border-radius: var(--radius-sm);
1033
+ border: 1px solid var(--border);
1034
+ white-space: pre-wrap;
1035
+ word-break: break-word;
1036
+ margin: 0;
1037
+ }
1038
+
1039
+ @keyframes blink {
1040
+ 0%, 100% { opacity: 1; }
1041
+ 50% { opacity: 0.3; }
1042
+ }
1043
+
1044
+ /* Tool Results Container */
1045
+ .tool-results-container {
1046
+ margin: 8px 0;
1047
+ }
1048
+
1049
+ .tool-result-item {
1050
+ background: var(--bg-secondary);
1051
+ border: 1px solid var(--border);
1052
+ border-radius: var(--radius-sm);
1053
+ margin-bottom: 6px;
1054
+ overflow: hidden;
1055
+ }
1056
+
1057
+ .tool-result-item.collapsed .tool-result-content {
1058
+ display: none;
1059
+ }
1060
+
1061
+ .tool-result-item.expanded {
1062
+ border-color: var(--accent);
1063
+ }
1064
+
1065
+ .tool-result-header {
1066
+ display: flex;
1067
+ align-items: center;
1068
+ gap: 8px;
1069
+ padding: 8px 12px;
1070
+ cursor: pointer;
1071
+ background: var(--bg-tertiary);
1072
+ transition: background 0.2s;
1073
+ }
1074
+
1075
+ .tool-result-header:hover {
1076
+ background: var(--bg);
1077
+ }
1078
+
1079
+ .tool-result-icon {
1080
+ font-size: 14px;
1081
+ }
1082
+
1083
+ .tool-result-name {
1084
+ font-size: 12px;
1085
+ color: var(--text-secondary);
1086
+ flex: 1;
1087
+ }
1088
+
1089
+ .tool-result-toggle {
1090
+ font-size: 10px;
1091
+ color: var(--text-muted);
1092
+ transition: transform 0.2s;
1093
+ }
1094
+
1095
+ .tool-result-item.expanded .tool-result-toggle {
1096
+ transform: rotate(90deg);
1097
+ }
1098
+
1099
+ .tool-result-content {
1100
+ padding: 10px 12px;
1101
+ background: var(--bg);
1102
+ }
1103
+
1104
+ .tool-result-content pre {
1105
+ font-family: 'JetBrains Mono', monospace;
1106
+ font-size: 11px;
1107
+ color: var(--text-secondary);
1108
+ margin: 0;
1109
+ white-space: pre-wrap;
1110
+ word-break: break-all;
1111
+ }
1112
+
1113
+ .loop-header {
1114
+ display: flex;
1115
+ align-items: center;
1116
+ gap: 10px;
1117
+ margin-bottom: 6px;
1118
+ }
1119
+
1120
+ .loop-icon {
1121
+ font-size: 16px;
1122
+ }
1123
+
1124
+ .loop-status {
1125
+ font-size: 11px;
1126
+ color: var(--accent);
1127
+ background: var(--bg-tertiary);
1128
+ padding: 2px 6px;
1129
+ border-radius: 4px;
1130
+ }
1131
+
1132
+ .loop-content {
1133
+ font-size: 13px;
1134
+ color: var(--text-secondary);
1135
+ white-space: pre-wrap;
1136
+ }
1137
+
1138
+ @keyframes pulse {
1139
+ 0%, 100% { opacity: 1; transform: scale(1); }
1140
+ 50% { opacity: 0.7; transform: scale(1.1); }
1141
+ }
1142
+
1143
+ @keyframes slideIn {
1144
+ from { opacity: 0; transform: translateY(-10px); }
1145
+ to { opacity: 1; transform: translateY(0); }
1146
+ }
1147
+
1148
+ @keyframes fadeIn {
1149
+ from { opacity: 0; }
1150
+ to { opacity: 1; }
1151
+ }
1152
+
1153
+ /* Typing Indicator */
1154
+ .typing {
1155
+ display: flex;
1156
+ align-items: center;
1157
+ gap: 10px;
1158
+ padding: 12px 16px;
1159
+ }
1160
+
1161
+ .typing-spinner {
1162
+ width: 18px;
1163
+ height: 18px;
1164
+ border: 2px solid var(--border);
1165
+ border-top-color: var(--accent);
1166
+ border-right-color: var(--accent-dark);
1167
+ border-radius: 50%;
1168
+ animation: spin 0.8s linear infinite;
1169
+ }
1170
+
1171
+ .typing-text {
1172
+ color: var(--text-secondary);
1173
+ font-size: 14px;
1174
+ }
1175
+
1176
+ @keyframes spin {
1177
+ to { transform: rotate(360deg); }
1178
+ }
1179
+
1180
+ /* Streaming Indicator */
1181
+ .streaming-content {
1182
+ display: flex;
1183
+ align-items: center;
1184
+ gap: 8px;
1185
+ }
1186
+
1187
+ .streaming-content::before {
1188
+ content: '';
1189
+ width: 6px;
1190
+ height: 6px;
1191
+ background: var(--accent);
1192
+ border-radius: 50%;
1193
+ animation: streamPulse 1s ease-in-out infinite;
1194
+ box-shadow: 0 0 8px var(--accent-glow);
1195
+ }
1196
+
1197
+ @keyframes streamPulse {
1198
+ 0%, 100% { opacity: 0.4; transform: scale(0.8); }
1199
+ 50% { opacity: 1; transform: scale(1.2); }
1200
+ }
1201
+
1202
+ /* Loading Dots */
1203
+ .loading-dots {
1204
+ font-family: 'JetBrains Mono', monospace;
1205
+ }
1206
+
1207
+ .loading-dots span {
1208
+ animation: blink 1.4s infinite;
1209
+ }
1210
+
1211
+ .loading-dots span:nth-child(2) { animation-delay: 0.2s; }
1212
+ .loading-dots span:nth-child(3) { animation-delay: 0.4s; }
1213
+
1214
+ @keyframes blink {
1215
+ 0%, 20% { opacity: 0; }
1216
+ 40%, 100% { opacity: 1; }
1217
+ }
1218
+
1219
+ /* Input Area */
1220
+ .input-area {
1221
+ padding: 20px 24px;
1222
+ border-top: 1px solid var(--border);
1223
+ background: var(--bg-sidebar);
1224
+ flex-shrink: 0;
1225
+ }
1226
+
1227
+ .input-wrapper {
1228
+ display: flex;
1229
+ gap: 12px;
1230
+ max-width: 900px;
1231
+ margin: 0 auto;
1232
+ }
1233
+
1234
+ #input {
1235
+ flex: 1;
1236
+ padding: 14px 18px;
1237
+ background: var(--bg);
1238
+ border: 1px solid var(--border);
1239
+ border-radius: var(--radius);
1240
+ color: var(--text);
1241
+ font-size: 15px;
1242
+ outline: none;
1243
+ transition: var(--transition);
1244
+ font-family: inherit;
1245
+ }
1246
+
1247
+ #input:focus {
1248
+ border-color: var(--accent);
1249
+ box-shadow: 0 0 0 3px var(--accent-glow);
1250
+ }
1251
+
1252
+ #input::placeholder {
1253
+ color: var(--text-muted);
1254
+ }
1255
+
1256
+ .send-btn {
1257
+ width: 48px;
1258
+ height: 48px;
1259
+ border-radius: var(--radius);
1260
+ background: var(--accent);
1261
+ border: none;
1262
+ color: white;
1263
+ cursor: pointer;
1264
+ display: flex;
1265
+ align-items: center;
1266
+ justify-content: center;
1267
+ transition: var(--transition);
1268
+ flex-shrink: 0;
1269
+ }
1270
+
1271
+ .send-btn:hover {
1272
+ background: var(--accent-hover);
1273
+ transform: scale(1.05);
1274
+ }
1275
+
1276
+ .send-btn:active {
1277
+ transform: scale(0.95);
1278
+ }
1279
+
1280
+ /* Responsive */
1281
+ @media (max-width: 768px) {
1282
+ .sidebar {
1283
+ position: absolute;
1284
+ height: 100%;
1285
+ z-index: 200;
1286
+ }
1287
+
1288
+ .sidebar.collapsed {
1289
+ transform: translateX(calc(-1 * var(--sidebar-width)));
1290
+ }
1291
+
1292
+ .sidebar-collapsed {
1293
+ display: none;
1294
+ }
1295
+
1296
+ .message {
1297
+ max-width: 95%;
1298
+ }
1299
+ }
1300
+
1301
+ /* Modal */
1302
+ .modal {
1303
+ display: none;
1304
+ position: fixed;
1305
+ top: 0;
1306
+ left: 0;
1307
+ width: 100%;
1308
+ height: 100%;
1309
+ background: rgba(0, 0, 0, 0.7);
1310
+ z-index: 1000;
1311
+ align-items: center;
1312
+ justify-content: center;
1313
+ }
1314
+
1315
+ .modal.active {
1316
+ display: flex;
1317
+ }
1318
+
1319
+ .modal-content {
1320
+ background: var(--bg);
1321
+ border: 1px solid var(--border);
1322
+ border-radius: var(--radius);
1323
+ width: 90%;
1324
+ max-width: 500px;
1325
+ max-height: 80vh;
1326
+ overflow: hidden;
1327
+ display: flex;
1328
+ flex-direction: column;
1329
+ }
1330
+
1331
+ .modal-content.modal-p2p-wide {
1332
+ max-width: 650px;
1333
+ }
1334
+
1335
+ .modal-header {
1336
+ display: flex;
1337
+ align-items: center;
1338
+ justify-content: space-between;
1339
+ padding: 16px 20px;
1340
+ border-bottom: 1px solid var(--border);
1341
+ }
1342
+
1343
+ .modal-header h2 {
1344
+ margin: 0;
1345
+ font-size: 18px;
1346
+ font-weight: 600;
1347
+ }
1348
+
1349
+ .modal-close {
1350
+ background: none;
1351
+ border: none;
1352
+ font-size: 24px;
1353
+ color: var(--text-secondary);
1354
+ cursor: pointer;
1355
+ padding: 0;
1356
+ line-height: 1;
1357
+ }
1358
+
1359
+ .modal-close:hover {
1360
+ color: var(--text);
1361
+ }
1362
+
1363
+ .modal-body {
1364
+ padding: 20px;
1365
+ overflow-y: auto;
1366
+ flex: 1;
1367
+ }
1368
+
1369
+ /* P2P Section */
1370
+ .p2p-section {
1371
+ margin-bottom: 24px;
1372
+ }
1373
+
1374
+ .p2p-section:last-child {
1375
+ margin-bottom: 0;
1376
+ }
1377
+
1378
+ .p2p-section h3 {
1379
+ margin: 0 0 12px 0;
1380
+ font-size: 14px;
1381
+ color: var(--text-secondary);
1382
+ font-weight: 500;
1383
+ }
1384
+
1385
+ .p2p-identity {
1386
+ display: flex;
1387
+ align-items: center;
1388
+ gap: 8px;
1389
+ margin-bottom: 12px;
1390
+ }
1391
+
1392
+ .p2p-identity-info {
1393
+ flex: 1;
1394
+ display: flex;
1395
+ flex-direction: column;
1396
+ gap: 4px;
1397
+ }
1398
+
1399
+ .p2p-label {
1400
+ font-size: 12px;
1401
+ color: var(--text-secondary);
1402
+ }
1403
+
1404
+ .p2p-value {
1405
+ font-size: 12px;
1406
+ color: var(--text);
1407
+ word-break: break-all;
1408
+ }
1409
+
1410
+ /* Task Queue */
1411
+ .task-badge {
1412
+ position: absolute;
1413
+ top: -4px;
1414
+ right: -4px;
1415
+ background: var(--accent);
1416
+ color: var(--bg);
1417
+ font-size: 10px;
1418
+ font-weight: 600;
1419
+ padding: 2px 6px;
1420
+ border-radius: 10px;
1421
+ min-width: 18px;
1422
+ text-align: center;
1423
+ }
1424
+
1425
+ .task-toolbar {
1426
+ display: flex;
1427
+ gap: 12px;
1428
+ margin-bottom: 16px;
1429
+ }
1430
+
1431
+ .task-list {
1432
+ display: flex;
1433
+ flex-direction: column;
1434
+ gap: 12px;
1435
+ }
1436
+
1437
+ .task-empty {
1438
+ text-align: center;
1439
+ color: var(--text-secondary);
1440
+ padding: 40px 20px;
1441
+ }
1442
+
1443
+ .task-item {
1444
+ background: var(--bg-secondary);
1445
+ border: 1px solid var(--border);
1446
+ border-radius: var(--radius-sm);
1447
+ padding: 16px;
1448
+ cursor: pointer;
1449
+ transition: var(--transition);
1450
+ }
1451
+
1452
+ .task-item:hover {
1453
+ border-color: var(--accent);
1454
+ }
1455
+
1456
+ .task-item.running {
1457
+ border-color: var(--accent);
1458
+ background: var(--bg-hover);
1459
+ }
1460
+
1461
+ .task-item.completed {
1462
+ opacity: 0.7;
1463
+ }
1464
+
1465
+ .task-item-header {
1466
+ display: flex;
1467
+ align-items: center;
1468
+ justify-content: space-between;
1469
+ margin-bottom: 8px;
1470
+ }
1471
+
1472
+ .task-item-title {
1473
+ font-weight: 500;
1474
+ display: flex;
1475
+ align-items: center;
1476
+ gap: 8px;
1477
+ }
1478
+
1479
+ .task-item-status {
1480
+ font-size: 12px;
1481
+ padding: 2px 8px;
1482
+ border-radius: 4px;
1483
+ background: var(--bg-tertiary);
1484
+ color: var(--text-secondary);
1485
+ }
1486
+
1487
+ .task-item-status.pending { background: var(--bg-active); color: var(--text-secondary); }
1488
+ .task-item-status.running { background: var(--accent); color: var(--bg); }
1489
+ .task-item-status.completed { background: var(--success); color: var(--bg); }
1490
+ .task-item-status.failed { background: var(--error); color: white; }
1491
+ .task-item-status.paused { background: var(--warning); color: var(--bg); }
1492
+
1493
+ .task-item-progress {
1494
+ height: 4px;
1495
+ background: var(--bg-tertiary);
1496
+ border-radius: 2px;
1497
+ overflow: hidden;
1498
+ margin: 8px 0;
1499
+ }
1500
+
1501
+ .task-item-progress-bar {
1502
+ height: 100%;
1503
+ background: var(--accent);
1504
+ transition: width 0.3s;
1505
+ }
1506
+
1507
+ .task-item-steps {
1508
+ margin-top: 8px;
1509
+ padding-left: 16px;
1510
+ border-left: 2px solid var(--border);
1511
+ }
1512
+
1513
+ .task-item-step {
1514
+ display: flex;
1515
+ align-items: center;
1516
+ gap: 8px;
1517
+ padding: 4px 0;
1518
+ font-size: 13px;
1519
+ color: var(--text-secondary);
1520
+ }
1521
+
1522
+ .task-item-step.completed { color: var(--success); }
1523
+ .task-item-step.running { color: var(--accent); }
1524
+ .task-item-step.failed { color: var(--error); }
1525
+
1526
+ .task-item-actions {
1527
+ display: flex;
1528
+ gap: 8px;
1529
+ margin-top: 12px;
1530
+ }
1531
+
1532
+ .task-item-desc {
1533
+ font-size: 13px;
1534
+ color: var(--text-secondary);
1535
+ margin-bottom: 8px;
1536
+ }
1537
+
1538
+ .modal-wide .modal-content {
1539
+ max-width: 700px;
1540
+ }
1541
+
1542
+ .form-group textarea {
1543
+ width: 100%;
1544
+ padding: 10px 12px;
1545
+ background: var(--bg-primary);
1546
+ border: 1px solid var(--border);
1547
+ border-radius: 6px;
1548
+ color: var(--text-primary);
1549
+ font-size: 14px;
1550
+ font-family: inherit;
1551
+ resize: vertical;
1552
+ }
1553
+
1554
+ .form-group textarea:focus {
1555
+ outline: none;
1556
+ border-color: var(--accent);
1557
+ }
1558
+
1559
+ .btn-group {
1560
+ display: flex;
1561
+ gap: 12px;
1562
+ margin-top: 16px;
1563
+ }
1564
+
1565
+ .btn-group .btn {
1566
+ flex: 1;
1567
+ }
1568
+
1569
+ .p2p-value.mono {
1570
+ font-family: var(--font-mono);
1571
+ }
1572
+
1573
+ .btn-small {
1574
+ padding: 6px;
1575
+ background: var(--bg-hover);
1576
+ border: 1px solid var(--border);
1577
+ border-radius: var(--radius-sm);
1578
+ color: var(--text-secondary);
1579
+ cursor: pointer;
1580
+ display: flex;
1581
+ align-items: center;
1582
+ justify-content: center;
1583
+ }
1584
+
1585
+ .btn-small:hover {
1586
+ background: var(--bg-active);
1587
+ color: var(--accent);
1588
+ border-color: var(--accent);
1589
+ }
1590
+
1591
+ .btn-primary, .btn-secondary {
1592
+ padding: 8px 16px;
1593
+ border-radius: var(--radius-sm);
1594
+ font-size: 14px;
1595
+ cursor: pointer;
1596
+ transition: var(--transition);
1597
+ white-space: nowrap;
1598
+ }
1599
+
1600
+ .btn-primary {
1601
+ background: var(--accent);
1602
+ border: 1px solid var(--accent);
1603
+ color: white;
1604
+ }
1605
+
1606
+ .btn-primary:hover {
1607
+ background: var(--accent-hover);
1608
+ }
1609
+
1610
+ .btn-secondary {
1611
+ background: var(--bg-hover);
1612
+ border: 1px solid var(--border);
1613
+ color: var(--text);
1614
+ }
1615
+
1616
+ .btn-secondary:hover {
1617
+ background: var(--bg-active);
1618
+ border-color: var(--accent);
1619
+ }
1620
+
1621
+ .p2p-connect {
1622
+ display: flex;
1623
+ gap: 8px;
1624
+ }
1625
+
1626
+ .p2p-connect input {
1627
+ flex: 1;
1628
+ padding: 8px 12px;
1629
+ background: var(--bg);
1630
+ border: 1px solid var(--border);
1631
+ border-radius: var(--radius-sm);
1632
+ color: var(--text);
1633
+ font-size: 14px;
1634
+ }
1635
+
1636
+ .p2p-connect input:focus {
1637
+ outline: none;
1638
+ border-color: var(--accent);
1639
+ }
1640
+
1641
+ .p2p-connect input::placeholder {
1642
+ color: var(--text-secondary);
1643
+ }
1644
+
1645
+ .p2p-peers-list, .p2p-channels-list {
1646
+ max-height: 200px;
1647
+ overflow-y: auto;
1648
+ border: 1px solid var(--border);
1649
+ border-radius: var(--radius-sm);
1650
+ }
1651
+
1652
+ .p2p-empty {
1653
+ padding: 20px;
1654
+ text-align: center;
1655
+ color: var(--text-secondary);
1656
+ font-size: 14px;
1657
+ }
1658
+
1659
+ .p2p-peer-item {
1660
+ display: flex;
1661
+ align-items: center;
1662
+ justify-content: space-between;
1663
+ padding: 10px 12px;
1664
+ border-bottom: 1px solid var(--border);
1665
+ }
1666
+
1667
+ .p2p-peer-item:last-child {
1668
+ border-bottom: none;
1669
+ }
1670
+
1671
+ .p2p-peer-info {
1672
+ display: flex;
1673
+ flex-direction: column;
1674
+ gap: 2px;
1675
+ }
1676
+
1677
+ .p2p-peer-id {
1678
+ font-size: 12px;
1679
+ font-family: var(--font-mono);
1680
+ color: var(--text);
1681
+ }
1682
+
1683
+ .p2p-peer-status {
1684
+ font-size: 11px;
1685
+ color: var(--text-secondary);
1686
+ }
1687
+
1688
+ .p2p-peer-status.online {
1689
+ color: var(--success);
1690
+ }
1691
+
1692
+ .p2p-channel-item {
1693
+ display: flex;
1694
+ align-items: center;
1695
+ gap: 8px;
1696
+ padding: 10px 12px;
1697
+ border-bottom: 1px solid var(--border);
1698
+ cursor: pointer;
1699
+ transition: var(--transition);
1700
+ }
1701
+
1702
+ .p2p-channel-item:last-child {
1703
+ border-bottom: none;
1704
+ }
1705
+
1706
+ .p2p-channel-item:hover {
1707
+ background: var(--bg-hover);
1708
+ }
1709
+
1710
+ .p2p-channel-item.active {
1711
+ background: var(--bg-active);
1712
+ border-left: 3px solid var(--accent);
1713
+ }
1714
+
1715
+ .p2p-channel-info {
1716
+ flex: 1;
1717
+ display: flex;
1718
+ flex-direction: column;
1719
+ gap: 2px;
1720
+ min-width: 0;
1721
+ }
1722
+
1723
+ .p2p-channel-name {
1724
+ font-size: 14px;
1725
+ font-weight: 500;
1726
+ }
1727
+
1728
+ .p2p-channel-did {
1729
+ font-size: 10px;
1730
+ font-family: var(--font-mono);
1731
+ color: var(--text-secondary);
1732
+ overflow: hidden;
1733
+ text-overflow: ellipsis;
1734
+ white-space: nowrap;
1735
+ }
1736
+
1737
+ .p2p-channel-cid {
1738
+ font-size: 9px;
1739
+ font-family: var(--font-mono);
1740
+ color: var(--accent);
1741
+ overflow: hidden;
1742
+ text-overflow: ellipsis;
1743
+ white-space: nowrap;
1744
+ }
1745
+
1746
+ .p2p-channel-icon {
1747
+ width: 24px;
1748
+ height: 24px;
1749
+ display: flex;
1750
+ align-items: center;
1751
+ justify-content: center;
1752
+ font-size: 14px;
1753
+ }
1754
+
1755
+ .p2p-channel-name {
1756
+ flex: 1;
1757
+ font-size: 14px;
1758
+ }
1759
+
1760
+ .p2p-channel-action {
1761
+ color: var(--text-secondary);
1762
+ font-size: 12px;
1763
+ }
1764
+
1765
+ .p2p-channel-action:hover {
1766
+ color: var(--accent);
1767
+ }
1768
+
1769
+ /* ==================== API Config Page (Simplified) ==================== */
1770
+
1771
+ .api-config-page {
1772
+ max-width: 800px;
1773
+ margin: 0 auto;
1774
+ padding: 24px;
1775
+ }
1776
+
1777
+ .page-header {
1778
+ display: flex;
1779
+ align-items: center;
1780
+ justify-content: space-between;
1781
+ margin-bottom: 24px;
1782
+ }
1783
+
1784
+ .page-title-group {
1785
+ display: flex;
1786
+ align-items: center;
1787
+ gap: 16px;
1788
+ }
1789
+
1790
+ .page-title-group h1 {
1791
+ font-size: 24px;
1792
+ font-weight: 600;
1793
+ color: var(--text);
1794
+ }
1795
+
1796
+ .config-count-badge {
1797
+ padding: 4px 12px;
1798
+ background: var(--accent-glow);
1799
+ border: 1px solid var(--accent);
1800
+ border-radius: 20px;
1801
+ font-size: 12px;
1802
+ color: var(--accent);
1803
+ }
1804
+
1805
+ .back-link {
1806
+ display: flex;
1807
+ align-items: center;
1808
+ gap: 6px;
1809
+ color: var(--text-muted);
1810
+ text-decoration: none;
1811
+ font-size: 14px;
1812
+ transition: color 0.2s;
1813
+ }
1814
+
1815
+ .back-link:hover {
1816
+ color: var(--accent);
1817
+ }
1818
+
1819
+ .provider-grid {
1820
+ display: flex;
1821
+ flex-direction: column;
1822
+ gap: 12px;
1823
+ }
1824
+
1825
+ /* Provider Card */
1826
+ .provider-card {
1827
+ background: var(--bg-sidebar);
1828
+ border: 1px solid var(--border);
1829
+ border-radius: var(--radius);
1830
+ padding: 16px;
1831
+ cursor: pointer;
1832
+ transition: all 0.2s;
1833
+ }
1834
+
1835
+ .provider-card:hover {
1836
+ border-color: var(--accent);
1837
+ background: var(--bg-hover);
1838
+ }
1839
+
1840
+ .provider-card.active {
1841
+ border-color: var(--accent);
1842
+ background: linear-gradient(135deg, var(--bg-hover) 0%, var(--bg-sidebar) 100%);
1843
+ }
1844
+
1845
+ .provider-header {
1846
+ display: flex;
1847
+ align-items: center;
1848
+ gap: 12px;
1849
+ margin-bottom: 12px;
1850
+ }
1851
+
1852
+ .provider-icon {
1853
+ width: 44px;
1854
+ height: 44px;
1855
+ border-radius: 10px;
1856
+ background: linear-gradient(135deg, var(--accent) 0%, var(--accent-dark) 100%);
1857
+ display: flex;
1858
+ align-items: center;
1859
+ justify-content: center;
1860
+ font-size: 20px;
1861
+ font-weight: bold;
1862
+ color: var(--bg);
1863
+ flex-shrink: 0;
1864
+ }
1865
+
1866
+ .provider-info {
1867
+ flex: 1;
1868
+ }
1869
+
1870
+ .provider-name {
1871
+ font-size: 16px;
1872
+ font-weight: 600;
1873
+ color: var(--text);
1874
+ margin-bottom: 4px;
1875
+ }
1876
+
1877
+ .provider-desc {
1878
+ font-size: 12px;
1879
+ color: var(--text-muted);
1880
+ }
1881
+
1882
+ .status-badge {
1883
+ display: flex;
1884
+ align-items: center;
1885
+ gap: 6px;
1886
+ padding: 4px 10px;
1887
+ border-radius: 20px;
1888
+ font-size: 12px;
1889
+ font-weight: 500;
1890
+ }
1891
+
1892
+ .status-badge .status-dot {
1893
+ width: 8px;
1894
+ height: 8px;
1895
+ border-radius: 50%;
1896
+ }
1897
+
1898
+ .status-accent {
1899
+ background: var(--accent-glow);
1900
+ color: var(--accent);
1901
+ }
1902
+
1903
+ .status-accent .status-dot {
1904
+ background: var(--accent);
1905
+ animation: pulse 2s infinite;
1906
+ }
1907
+
1908
+ .status-green {
1909
+ background: var(--success-bg);
1910
+ color: var(--success);
1911
+ }
1912
+
1913
+ .status-green .status-dot {
1914
+ background: var(--success);
1915
+ }
1916
+
1917
+ .status-yellow {
1918
+ background: var(--warning-bg);
1919
+ color: var(--warning);
1920
+ }
1921
+
1922
+ .status-yellow .status-dot {
1923
+ background: var(--warning);
1924
+ }
1925
+
1926
+ .status-muted {
1927
+ background: var(--bg-active);
1928
+ color: var(--text-muted);
1929
+ }
1930
+
1931
+ .status-muted .status-dot {
1932
+ background: var(--text-muted);
1933
+ }
1934
+
1935
+ .provider-footer {
1936
+ display: flex;
1937
+ align-items: center;
1938
+ gap: 16px;
1939
+ padding-top: 12px;
1940
+ border-top: 1px solid var(--border);
1941
+ font-size: 13px;
1942
+ color: var(--text-secondary);
1943
+ }
1944
+
1945
+ .config-status {
1946
+ display: flex;
1947
+ align-items: center;
1948
+ gap: 6px;
1949
+ }
1950
+
1951
+ .status-icon {
1952
+ font-size: 14px;
1953
+ }
1954
+
1955
+ .status-icon.configured {
1956
+ color: var(--success);
1957
+ }
1958
+
1959
+ .status-icon.not-configured {
1960
+ color: var(--text-muted);
1961
+ }
1962
+
1963
+ .model-info {
1964
+ color: var(--text-muted);
1965
+ }
1966
+
1967
+ .arrow-indicator {
1968
+ margin-left: auto;
1969
+ font-size: 20px;
1970
+ color: var(--text-muted);
1971
+ }
1972
+
1973
+ /* Loading State */
1974
+ .loading-state {
1975
+ display: flex;
1976
+ flex-direction: column;
1977
+ align-items: center;
1978
+ justify-content: center;
1979
+ padding: 80px 20px;
1980
+ gap: 16px;
1981
+ }
1982
+
1983
+ .loading-state p {
1984
+ font-size: 16px;
1985
+ color: var(--text-secondary);
1986
+ }
1987
+
1988
+ .loading-hint {
1989
+ font-size: 14px !important;
1990
+ color: var(--text-muted) !important;
1991
+ }
1992
+
1993
+ /* Error State */
1994
+ .error-state {
1995
+ display: flex;
1996
+ flex-direction: column;
1997
+ align-items: center;
1998
+ justify-content: center;
1999
+ padding: 80px 20px;
2000
+ gap: 16px;
2001
+ }
2002
+
2003
+ .error-icon {
2004
+ font-size: 48px;
2005
+ }
2006
+
2007
+ .error-message {
2008
+ font-size: 14px;
2009
+ color: var(--text-muted);
2010
+ }
2011
+
2012
+ .retry-btn {
2013
+ padding: 10px 24px;
2014
+ background: var(--accent);
2015
+ color: var(--bg);
2016
+ border: none;
2017
+ border-radius: var(--radius-sm);
2018
+ font-size: 14px;
2019
+ cursor: pointer;
2020
+ transition: opacity 0.2s;
2021
+ }
2022
+
2023
+ .retry-btn:hover {
2024
+ opacity: 0.9;
2025
+ }
2026
+
2027
+ /* Modal Overlay */
2028
+ .modal-overlay {
2029
+ position: fixed;
2030
+ inset: 0;
2031
+ background: rgba(0, 0, 0, 0.7);
2032
+ display: flex;
2033
+ align-items: center;
2034
+ justify-content: center;
2035
+ z-index: 1000;
2036
+ padding: 20px;
2037
+ }
2038
+
2039
+ .modal-box {
2040
+ background: var(--bg-sidebar);
2041
+ border: 1px solid var(--border);
2042
+ border-radius: var(--radius);
2043
+ width: 100%;
2044
+ max-width: 480px;
2045
+ max-height: 90vh;
2046
+ overflow: hidden;
2047
+ display: flex;
2048
+ flex-direction: column;
2049
+ }
2050
+
2051
+ .modal-header {
2052
+ display: flex;
2053
+ align-items: center;
2054
+ justify-content: space-between;
2055
+ padding: 20px;
2056
+ border-bottom: 1px solid var(--border);
2057
+ }
2058
+
2059
+ .modal-title-group {
2060
+ display: flex;
2061
+ align-items: center;
2062
+ gap: 12px;
2063
+ }
2064
+
2065
+ .modal-icon {
2066
+ width: 40px;
2067
+ height: 40px;
2068
+ border-radius: 10px;
2069
+ background: linear-gradient(135deg, var(--accent) 0%, var(--accent-dark) 100%);
2070
+ display: flex;
2071
+ align-items: center;
2072
+ justify-content: center;
2073
+ font-size: 18px;
2074
+ font-weight: bold;
2075
+ color: var(--bg);
2076
+ }
2077
+
2078
+ .modal-header h2 {
2079
+ font-size: 18px;
2080
+ font-weight: 600;
2081
+ color: var(--text);
2082
+ margin-bottom: 4px;
2083
+ }
2084
+
2085
+ .modal-subtitle {
2086
+ font-size: 12px;
2087
+ color: var(--text-muted);
2088
+ }
2089
+
2090
+ .modal-close {
2091
+ width: 32px;
2092
+ height: 32px;
2093
+ border-radius: 8px;
2094
+ background: var(--bg-active);
2095
+ border: 1px solid var(--border);
2096
+ color: var(--text-muted);
2097
+ font-size: 20px;
2098
+ cursor: pointer;
2099
+ display: flex;
2100
+ align-items: center;
2101
+ justify-content: center;
2102
+ transition: all 0.2s;
2103
+ }
2104
+
2105
+ .modal-close:hover {
2106
+ background: var(--error-bg);
2107
+ border-color: var(--error);
2108
+ color: var(--error);
2109
+ }
2110
+
2111
+ .modal-form {
2112
+ padding: 20px;
2113
+ overflow-y: auto;
2114
+ }
2115
+
2116
+ .form-group {
2117
+ margin-bottom: 20px;
2118
+ }
2119
+
2120
+ .form-group label {
2121
+ display: flex;
2122
+ align-items: center;
2123
+ gap: 8px;
2124
+ font-size: 14px;
2125
+ font-weight: 500;
2126
+ color: var(--text-secondary);
2127
+ margin-bottom: 8px;
2128
+ }
2129
+
2130
+ .label-icon {
2131
+ font-size: 16px;
2132
+ }
2133
+
2134
+ .configured-tag {
2135
+ margin-left: auto;
2136
+ padding: 2px 8px;
2137
+ background: var(--success-bg);
2138
+ color: var(--success);
2139
+ border-radius: 10px;
2140
+ font-size: 11px;
2141
+ font-weight: normal;
2142
+ }
2143
+
2144
+ .form-group input {
2145
+ width: 100%;
2146
+ padding: 12px 14px;
2147
+ background: var(--bg);
2148
+ border: 1px solid var(--border);
2149
+ border-radius: var(--radius-sm);
2150
+ color: var(--text);
2151
+ font-size: 14px;
2152
+ transition: border-color 0.2s;
2153
+ }
2154
+
2155
+ .form-group input:focus {
2156
+ outline: none;
2157
+ border-color: var(--accent);
2158
+ }
2159
+
2160
+ .form-group input::placeholder {
2161
+ color: var(--text-muted);
2162
+ }
2163
+
2164
+ .form-hint {
2165
+ font-size: 12px;
2166
+ color: var(--text-muted);
2167
+ margin-top: 6px;
2168
+ }
2169
+
2170
+ .form-row {
2171
+ display: flex;
2172
+ gap: 12px;
2173
+ }
2174
+
2175
+ .form-row .form-group {
2176
+ flex: 1;
2177
+ }
2178
+
2179
+ .form-group-small {
2180
+ max-width: 100px;
2181
+ }
2182
+
2183
+ .test-btn {
2184
+ display: flex;
2185
+ align-items: center;
2186
+ gap: 8px;
2187
+ padding: 10px 16px;
2188
+ background: transparent;
2189
+ border: 1px solid var(--accent);
2190
+ border-radius: var(--radius-sm);
2191
+ color: var(--accent);
2192
+ font-size: 14px;
2193
+ cursor: pointer;
2194
+ transition: all 0.2s;
2195
+ }
2196
+
2197
+ .test-btn:hover:not(:disabled) {
2198
+ background: var(--accent-glow);
2199
+ }
2200
+
2201
+ .test-btn:disabled {
2202
+ opacity: 0.6;
2203
+ cursor: not-allowed;
2204
+ }
2205
+
2206
+ .spinner {
2207
+ width: 16px;
2208
+ height: 16px;
2209
+ border: 2px solid var(--border);
2210
+ border-top-color: var(--accent);
2211
+ border-radius: 50%;
2212
+ animation: spin 1s linear infinite;
2213
+ }
2214
+
2215
+ .test-result {
2216
+ margin-top: 12px;
2217
+ padding: 12px;
2218
+ border-radius: var(--radius-sm);
2219
+ font-size: 14px;
2220
+ display: flex;
2221
+ align-items: center;
2222
+ gap: 8px;
2223
+ }
2224
+
2225
+ .test-success {
2226
+ background: var(--success-bg);
2227
+ color: var(--success);
2228
+ }
2229
+
2230
+ .test-error {
2231
+ background: var(--error-bg);
2232
+ color: var(--error);
2233
+ }
2234
+
2235
+ .result-icon {
2236
+ font-size: 16px;
2237
+ }
2238
+
2239
+ .form-actions {
2240
+ display: flex;
2241
+ gap: 12px;
2242
+ margin-top: 24px;
2243
+ }
2244
+
2245
+ .btn-cancel,
2246
+ .btn-save {
2247
+ flex: 1;
2248
+ padding: 12px;
2249
+ border-radius: var(--radius-sm);
2250
+ font-size: 14px;
2251
+ font-weight: 500;
2252
+ cursor: pointer;
2253
+ transition: all 0.2s;
2254
+ }
2255
+
2256
+ .btn-cancel {
2257
+ background: var(--bg-active);
2258
+ border: 1px solid var(--border);
2259
+ color: var(--text);
2260
+ }
2261
+
2262
+ .btn-cancel:hover {
2263
+ border-color: var(--text-muted);
2264
+ }
2265
+
2266
+ .btn-save {
2267
+ background: var(--accent);
2268
+ border: none;
2269
+ color: var(--bg);
2270
+ }
2271
+
2272
+ .btn-save:hover {
2273
+ opacity: 0.9;
2274
+ }
2275
+
2276
+ @keyframes spin {
2277
+ to { transform: rotate(360deg); }
2278
+ }
2279
+ background: var(--bg-sidebar);
2280
+ border: 1px solid var(--border);
2281
+ border-radius: var(--radius-sm);
2282
+ padding: 12px;
2283
+ margin-bottom: 12px;
2284
+ }
2285
+
2286
+ .iroh-status-item {
2287
+ display: flex;
2288
+ align-items: flex-start;
2289
+ gap: 8px;
2290
+ padding: 4px 0;
2291
+ }
2292
+
2293
+ .iroh-status-item .label {
2294
+ font-size: 12px;
2295
+ color: var(--text-secondary);
2296
+ min-width: 70px;
2297
+ }
2298
+
2299
+ .iroh-status-item .value {
2300
+ font-size: 12px;
2301
+ color: var(--text);
2302
+ word-break: break-all;
2303
+ }
2304
+
2305
+ .iroh-status-item .value.mono {
2306
+ font-family: var(--font-mono);
2307
+ }
2308
+
2309
+ .status-loading {
2310
+ color: var(--warning);
2311
+ }
2312
+
2313
+ .status-success {
2314
+ color: var(--success);
2315
+ }
2316
+
2317
+ .status-error {
2318
+ color: var(--error);
2319
+ }
2320
+
2321
+ .p2p-hint {
2322
+ font-size: 12px;
2323
+ color: var(--text-secondary);
2324
+ margin-bottom: 12px;
2325
+ }
2326
+
2327
+ .p2p-identity-box {
2328
+ background: var(--bg-sidebar);
2329
+ border: 1px solid var(--border);
2330
+ border-radius: var(--radius-sm);
2331
+ padding: 12px;
2332
+ margin-bottom: 12px;
2333
+ }
2334
+
2335
+ .identity-row {
2336
+ display: flex;
2337
+ align-items: center;
2338
+ gap: 8px;
2339
+ padding: 6px 0;
2340
+ }
2341
+
2342
+ .identity-label {
2343
+ font-size: 12px;
2344
+ color: var(--text-secondary);
2345
+ min-width: 60px;
2346
+ }
2347
+
2348
+ .identity-value {
2349
+ flex: 1;
2350
+ font-size: 11px;
2351
+ font-family: var(--font-mono);
2352
+ color: var(--accent);
2353
+ background: var(--bg);
2354
+ padding: 4px 8px;
2355
+ border-radius: 4px;
2356
+ overflow: hidden;
2357
+ text-overflow: ellipsis;
2358
+ white-space: nowrap;
2359
+ }
2360
+
2361
+ .copy-btn-small {
2362
+ padding: 4px 8px;
2363
+ background: var(--bg-hover);
2364
+ border: 1px solid var(--border);
2365
+ border-radius: 4px;
2366
+ color: var(--text-secondary);
2367
+ font-size: 11px;
2368
+ cursor: pointer;
2369
+ transition: var(--transition);
2370
+ }
2371
+
2372
+ .copy-btn-small:hover {
2373
+ background: var(--accent);
2374
+ color: var(--bg);
2375
+ border-color: var(--accent);
2376
+ }
2377
+
2378
+ .p2p-connect-form {
2379
+ display: flex;
2380
+ gap: 8px;
2381
+ }
2382
+
2383
+ .p2p-connect-form input {
2384
+ flex: 1;
2385
+ padding: 10px 12px;
2386
+ background: var(--bg);
2387
+ border: 1px solid var(--border);
2388
+ border-radius: var(--radius-sm);
2389
+ color: var(--text);
2390
+ font-size: 14px;
2391
+ font-family: var(--font-mono);
2392
+ }
2393
+
2394
+ .p2p-connect-form input:focus {
2395
+ outline: none;
2396
+ border-color: var(--accent);
2397
+ }
2398
+
2399
+ .p2p-connect-form input::placeholder {
2400
+ color: var(--text-secondary);
2401
+ font-family: inherit;
2402
+ }
2403
+
2404
+ .connect-result {
2405
+ margin-top: 8px;
2406
+ padding: 8px;
2407
+ border-radius: var(--radius-sm);
2408
+ font-size: 13px;
2409
+ }
2410
+
2411
+ .connect-result.success {
2412
+ background: var(--success-bg);
2413
+ color: var(--success);
2414
+ }
2415
+
2416
+ .connect-result.error {
2417
+ background: var(--error-bg);
2418
+ color: var(--error);
2419
+ }
2420
+
2421
+ .peers-list {
2422
+ max-height: 180px;
2423
+ overflow-y: auto;
2424
+ border: 1px solid var(--border);
2425
+ border-radius: var(--radius-sm);
2426
+ background: var(--bg-sidebar);
2427
+ }
2428
+
2429
+ .peer-empty {
2430
+ padding: 24px;
2431
+ text-align: center;
2432
+ color: var(--text-secondary);
2433
+ font-size: 13px;
2434
+ }
2435
+
2436
+ .p2p-messages-list {
2437
+ max-height: 200px;
2438
+ overflow-y: auto;
2439
+ border: 1px solid var(--border);
2440
+ border-radius: var(--radius-sm);
2441
+ background: var(--bg-sidebar);
2442
+ }
2443
+
2444
+ .msg-empty {
2445
+ padding: 24px;
2446
+ text-align: center;
2447
+ color: var(--text-secondary);
2448
+ font-size: 13px;
2449
+ }
2450
+
2451
+ .p2p-msg-item {
2452
+ padding: 10px 12px;
2453
+ border-bottom: 1px solid var(--border);
2454
+ }
2455
+
2456
+ .p2p-msg-item:last-child {
2457
+ border-bottom: none;
2458
+ }
2459
+
2460
+ .p2p-msg-header {
2461
+ display: flex;
2462
+ align-items: center;
2463
+ justify-content: space-between;
2464
+ margin-bottom: 4px;
2465
+ }
2466
+
2467
+ .p2p-msg-from {
2468
+ font-size: 11px;
2469
+ color: var(--accent);
2470
+ font-family: var(--font-mono);
2471
+ }
2472
+
2473
+ .p2p-msg-time {
2474
+ font-size: 10px;
2475
+ color: var(--text-muted);
2476
+ }
2477
+
2478
+ .p2p-msg-content {
2479
+ font-size: 12px;
2480
+ color: var(--text);
2481
+ word-break: break-word;
2482
+ }
2483
+
2484
+ /* ==================== API Config Page ==================== */
2485
+ .api-config-page {
2486
+ max-width: 900px;
2487
+ margin: 0 auto;
2488
+ padding: 24px;
2489
+ }
2490
+
2491
+ .loading-state {
2492
+ display: flex;
2493
+ flex-direction: column;
2494
+ align-items: center;
2495
+ justify-content: center;
2496
+ padding: 48px;
2497
+ color: var(--text-secondary);
2498
+ gap: 16px;
2499
+ }
2500
+
2501
+ .loading-spinner {
2502
+ width: 32px;
2503
+ height: 32px;
2504
+ border: 3px solid var(--border);
2505
+ border-top-color: var(--accent);
2506
+ border-radius: 50%;
2507
+ animation: spin 1s linear infinite;
2508
+ will-change: transform;
2509
+ }
2510
+
2511
+ @keyframes spin {
2512
+ to { transform: rotate(360deg); }
2513
+ }
2514
+
2515
+ .error-state {
2516
+ display: flex;
2517
+ flex-direction: column;
2518
+ align-items: center;
2519
+ padding: 48px;
2520
+ color: var(--text-secondary);
2521
+ gap: 16px;
2522
+ }
2523
+
2524
+ .error-icon {
2525
+ font-size: 48px;
2526
+ }
2527
+
2528
+ .error-message {
2529
+ font-size: 16px;
2530
+ color: var(--text-secondary);
2531
+ }
2532
+
2533
+ /* API Config Hint on main page */
2534
+ .api-config-hint {
2535
+ position: fixed;
2536
+ top: 80px;
2537
+ left: 50%;
2538
+ transform: translateX(-50%);
2539
+ display: flex;
2540
+ align-items: center;
2541
+ gap: 12px;
2542
+ padding: 12px 20px;
2543
+ background: var(--bg-secondary);
2544
+ border: 1px solid var(--accent);
2545
+ border-radius: var(--radius);
2546
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
2547
+ z-index: 1000;
2548
+ animation: slideDown 0.3s ease;
2549
+ }
2550
+
2551
+ @keyframes slideDown {
2552
+ from { opacity: 0; transform: translateX(-50%) translateY(-20px); }
2553
+ to { opacity: 1; transform: translateX(-50%) translateY(0); }
2554
+ }
2555
+
2556
+ .hint-icon {
2557
+ font-size: 24px;
2558
+ }
2559
+
2560
+ .hint-text {
2561
+ font-size: 14px;
2562
+ line-height: 1.5;
2563
+ color: var(--text-secondary);
2564
+ }
2565
+
2566
+ .hint-text strong {
2567
+ color: var(--accent);
2568
+ }
2569
+
2570
+ .hint-btn {
2571
+ padding: 8px 16px;
2572
+ background: var(--accent);
2573
+ color: var(--bg-primary);
2574
+ border: none;
2575
+ border-radius: 6px;
2576
+ font-size: 13px;
2577
+ font-weight: 500;
2578
+ cursor: pointer;
2579
+ transition: opacity 0.2s;
2580
+ }
2581
+
2582
+ .hint-btn:hover {
2583
+ opacity: 0.9;
2584
+ }
2585
+
2586
+ /* ============================================
2587
+ P2P Network Modal Styles
2588
+ ============================================ */
2589
+
2590
+ /* P2P Tabs */
2591
+ .p2p-tabs {
2592
+ display: flex;
2593
+ gap: 4px;
2594
+ margin-bottom: 20px;
2595
+ border-bottom: 1px solid var(--border);
2596
+ padding-bottom: 8px;
2597
+ }
2598
+
2599
+ .p2p-tab {
2600
+ padding: 8px 16px;
2601
+ background: transparent;
2602
+ border: none;
2603
+ border-radius: var(--radius) var(--radius) 0 0;
2604
+ color: var(--text-secondary);
2605
+ font-size: 14px;
2606
+ cursor: pointer;
2607
+ transition: all 0.2s;
2608
+ position: relative;
2609
+ }
2610
+
2611
+ .p2p-tab:hover {
2612
+ color: var(--text-primary);
2613
+ background: var(--bg-hover);
2614
+ }
2615
+
2616
+ .p2p-tab.active {
2617
+ color: var(--accent);
2618
+ background: var(--bg-secondary);
2619
+ }
2620
+
2621
+ .p2p-tab.active::after {
2622
+ content: '';
2623
+ position: absolute;
2624
+ bottom: -9px;
2625
+ left: 0;
2626
+ right: 0;
2627
+ height: 2px;
2628
+ background: var(--accent);
2629
+ }
2630
+
2631
+ .unread-badge {
2632
+ display: inline-flex;
2633
+ align-items: center;
2634
+ justify-content: center;
2635
+ min-width: 18px;
2636
+ height: 18px;
2637
+ padding: 0 5px;
2638
+ background: var(--error);
2639
+ color: white;
2640
+ border-radius: 9px;
2641
+ font-size: 11px;
2642
+ font-weight: 600;
2643
+ }
2644
+
2645
+ /* P2P Tab Content */
2646
+ .p2p-tab-content {
2647
+ display: none;
2648
+ animation: fadeIn 0.2s ease;
2649
+ }
2650
+
2651
+ .p2p-tab-content.active {
2652
+ display: block;
2653
+ }
2654
+
2655
+ @keyframes fadeIn {
2656
+ from { opacity: 0; }
2657
+ to { opacity: 1; }
2658
+ }
2659
+
2660
+ /* P2P Identity Card */
2661
+ .p2p-identity-card {
2662
+ background: var(--bg-secondary);
2663
+ border: 1px solid var(--border);
2664
+ border-radius: var(--radius);
2665
+ padding: 20px;
2666
+ margin-bottom: 16px;
2667
+ }
2668
+
2669
+ .identity-status {
2670
+ display: flex;
2671
+ align-items: center;
2672
+ gap: 8px;
2673
+ margin-bottom: 16px;
2674
+ }
2675
+
2676
+ .status-indicator {
2677
+ width: 10px;
2678
+ height: 10px;
2679
+ border-radius: 50%;
2680
+ background: var(--text-muted);
2681
+ }
2682
+
2683
+ .status-indicator.online {
2684
+ background: var(--success);
2685
+ box-shadow: 0 0 8px var(--success);
2686
+ }
2687
+
2688
+ .status-indicator.connecting {
2689
+ background: var(--warning);
2690
+ animation: pulse 1s infinite;
2691
+ }
2692
+
2693
+ .status-indicator.offline {
2694
+ background: var(--text-muted);
2695
+ }
2696
+
2697
+ @keyframes pulse {
2698
+ 0%, 100% { opacity: 1; }
2699
+ 50% { opacity: 0.5; }
2700
+ }
2701
+
2702
+ .identity-info {
2703
+ margin-bottom: 16px;
2704
+ }
2705
+
2706
+ .info-row {
2707
+ display: flex;
2708
+ align-items: center;
2709
+ gap: 8px;
2710
+ padding: 8px 0;
2711
+ border-bottom: 1px solid var(--border);
2712
+ }
2713
+
2714
+ .info-row:last-child {
2715
+ border-bottom: none;
2716
+ }
2717
+
2718
+ .info-label {
2719
+ min-width: 80px;
2720
+ color: var(--text-secondary);
2721
+ font-size: 13px;
2722
+ }
2723
+
2724
+ .info-value {
2725
+ flex: 1;
2726
+ font-size: 13px;
2727
+ word-break: break-all;
2728
+ }
2729
+
2730
+ .mono {
2731
+ font-family: var(--font-mono);
2732
+ }
2733
+
2734
+ .copy-btn {
2735
+ padding: 4px 8px;
2736
+ background: var(--bg-hover);
2737
+ border: 1px solid var(--border);
2738
+ border-radius: 4px;
2739
+ cursor: pointer;
2740
+ font-size: 12px;
2741
+ transition: all 0.2s;
2742
+ }
2743
+
2744
+ .copy-btn:hover {
2745
+ background: var(--accent);
2746
+ color: var(--bg-primary);
2747
+ }
2748
+
2749
+ /* Share Panel */
2750
+ .p2p-share-panel {
2751
+ background: var(--bg-secondary);
2752
+ border: 1px solid var(--border);
2753
+ border-radius: var(--radius);
2754
+ padding: 16px;
2755
+ margin-bottom: 16px;
2756
+ }
2757
+
2758
+ .p2p-share-panel h4 {
2759
+ margin-bottom: 12px;
2760
+ color: var(--text-primary);
2761
+ }
2762
+
2763
+ .share-actions {
2764
+ display: flex;
2765
+ gap: 8px;
2766
+ flex-wrap: wrap;
2767
+ }
2768
+
2769
+ .share-link-box {
2770
+ margin-top: 12px;
2771
+ }
2772
+
2773
+ .share-link-box input {
2774
+ flex: 1;
2775
+ padding: 10px 12px;
2776
+ background: var(--bg-primary);
2777
+ border: 1px solid var(--border);
2778
+ border-radius: var(--radius);
2779
+ color: var(--text-primary);
2780
+ font-family: var(--font-mono);
2781
+ font-size: 12px;
2782
+ }
2783
+
2784
+ .qr-hint {
2785
+ margin-top: 12px;
2786
+ color: var(--text-secondary);
2787
+ font-size: 13px;
2788
+ }
2789
+
2790
+ /* P2P Connect Section */
2791
+ .p2p-connect-section {
2792
+ margin-bottom: 20px;
2793
+ }
2794
+
2795
+ .p2p-connect-form {
2796
+ display: flex;
2797
+ gap: 8px;
2798
+ margin-top: 12px;
2799
+ }
2800
+
2801
+ .p2p-connect-form input {
2802
+ flex: 1;
2803
+ padding: 12px 16px;
2804
+ background: var(--bg-secondary);
2805
+ border: 1px solid var(--border);
2806
+ border-radius: var(--radius);
2807
+ color: var(--text-primary);
2808
+ font-size: 14px;
2809
+ }
2810
+
2811
+ .p2p-connect-form input:focus {
2812
+ outline: none;
2813
+ border-color: var(--accent);
2814
+ }
2815
+
2816
+ .p2p-connect-form .btn-primary {
2817
+ padding: 12px 20px;
2818
+ white-space: nowrap;
2819
+ }
2820
+
2821
+ /* Connect Progress */
2822
+ .connect-progress {
2823
+ margin-top: 16px;
2824
+ padding: 16px;
2825
+ background: var(--bg-secondary);
2826
+ border-radius: var(--radius);
2827
+ }
2828
+
2829
+ .progress-bar {
2830
+ height: 6px;
2831
+ background: var(--bg-hover);
2832
+ border-radius: 3px;
2833
+ overflow: hidden;
2834
+ margin-bottom: 8px;
2835
+ }
2836
+
2837
+ .progress-fill {
2838
+ height: 100%;
2839
+ background: linear-gradient(90deg, var(--accent), var(--accent-light));
2840
+ border-radius: 3px;
2841
+ transition: width 0.3s ease;
2842
+ width: 0%;
2843
+ }
2844
+
2845
+ .progress-text {
2846
+ color: var(--text-secondary);
2847
+ font-size: 13px;
2848
+ }
2849
+
2850
+ .connect-result {
2851
+ margin-top: 12px;
2852
+ padding: 12px;
2853
+ border-radius: var(--radius);
2854
+ font-size: 14px;
2855
+ }
2856
+
2857
+ .connect-result.success {
2858
+ background: rgba(34, 197, 94, 0.1);
2859
+ border: 1px solid var(--success);
2860
+ color: var(--success);
2861
+ }
2862
+
2863
+ .connect-result.error {
2864
+ background: rgba(239, 68, 68, 0.1);
2865
+ border: 1px solid var(--error);
2866
+ color: var(--error);
2867
+ }
2868
+
2869
+ .connect-result.warning {
2870
+ background: rgba(234, 179, 8, 0.1);
2871
+ border: 1px solid var(--warning);
2872
+ color: var(--warning);
2873
+ }
2874
+
2875
+ /* Quick Connect */
2876
+ .p2p-quick-connect {
2877
+ margin-top: 24px;
2878
+ }
2879
+
2880
+ .p2p-quick-connect h4 {
2881
+ margin-bottom: 12px;
2882
+ color: var(--text-secondary);
2883
+ font-size: 13px;
2884
+ }
2885
+
2886
+ .quick-list {
2887
+ display: flex;
2888
+ flex-direction: column;
2889
+ gap: 8px;
2890
+ }
2891
+
2892
+ .quick-empty {
2893
+ color: var(--text-muted);
2894
+ font-size: 13px;
2895
+ padding: 16px;
2896
+ text-align: center;
2897
+ }
2898
+
2899
+ .quick-item {
2900
+ display: flex;
2901
+ align-items: center;
2902
+ gap: 12px;
2903
+ padding: 12px;
2904
+ background: var(--bg-secondary);
2905
+ border: 1px solid var(--border);
2906
+ border-radius: var(--radius);
2907
+ cursor: pointer;
2908
+ transition: all 0.2s;
2909
+ }
2910
+
2911
+ .quick-item:hover {
2912
+ border-color: var(--accent);
2913
+ background: var(--bg-hover);
2914
+ }
2915
+
2916
+ .quick-item-icon {
2917
+ font-size: 20px;
2918
+ }
2919
+
2920
+ .quick-item-info {
2921
+ flex: 1;
2922
+ }
2923
+
2924
+ .quick-item-name {
2925
+ font-weight: 500;
2926
+ margin-bottom: 2px;
2927
+ }
2928
+
2929
+ .quick-item-meta {
2930
+ font-size: 12px;
2931
+ color: var(--text-secondary);
2932
+ }
2933
+
2934
+ .quick-item-status {
2935
+ display: flex;
2936
+ align-items: center;
2937
+ gap: 4px;
2938
+ font-size: 12px;
2939
+ }
2940
+
2941
+ .quick-item-status .dot {
2942
+ width: 6px;
2943
+ height: 6px;
2944
+ border-radius: 50%;
2945
+ }
2946
+
2947
+ .quick-item-status .dot.online { background: var(--success); }
2948
+ .quick-item-status .dot.offline { background: var(--text-muted); }
2949
+
2950
+ /* History List */
2951
+ .p2p-history-toolbar {
2952
+ margin-bottom: 12px;
2953
+ }
2954
+
2955
+ .history-list {
2956
+ display: flex;
2957
+ flex-direction: column;
2958
+ gap: 8px;
2959
+ }
2960
+
2961
+ .history-empty {
2962
+ color: var(--text-muted);
2963
+ font-size: 13px;
2964
+ padding: 32px;
2965
+ text-align: center;
2966
+ }
2967
+
2968
+ .history-item {
2969
+ display: flex;
2970
+ align-items: center;
2971
+ gap: 12px;
2972
+ padding: 12px;
2973
+ background: var(--bg-secondary);
2974
+ border: 1px solid var(--border);
2975
+ border-radius: var(--radius);
2976
+ cursor: pointer;
2977
+ transition: all 0.2s;
2978
+ }
2979
+
2980
+ .history-item:hover {
2981
+ border-color: var(--accent);
2982
+ }
2983
+
2984
+ .history-item.pinned {
2985
+ border-left: 3px solid var(--accent);
2986
+ }
2987
+
2988
+ .history-item-icon {
2989
+ font-size: 24px;
2990
+ }
2991
+
2992
+ .history-item-info {
2993
+ flex: 1;
2994
+ }
2995
+
2996
+ .history-item-name {
2997
+ font-weight: 500;
2998
+ display: flex;
2999
+ align-items: center;
3000
+ gap: 6px;
3001
+ }
3002
+
3003
+ .history-item-name .pin-icon {
3004
+ font-size: 12px;
3005
+ color: var(--accent);
3006
+ }
3007
+
3008
+ .history-item-meta {
3009
+ font-size: 12px;
3010
+ color: var(--text-secondary);
3011
+ display: flex;
3012
+ gap: 12px;
3013
+ }
3014
+
3015
+ .history-item-actions {
3016
+ display: flex;
3017
+ gap: 8px;
3018
+ }
3019
+
3020
+ .history-item-actions button {
3021
+ padding: 6px 12px;
3022
+ font-size: 12px;
3023
+ }
3024
+
3025
+ /* Peers Section */
3026
+ .p2p-peers-section {
3027
+ margin-top: 24px;
3028
+ padding-top: 16px;
3029
+ border-top: 1px solid var(--border);
3030
+ }
3031
+
3032
+ .p2p-peers-section h4 {
3033
+ margin-bottom: 12px;
3034
+ color: var(--text-secondary);
3035
+ font-size: 13px;
3036
+ }
3037
+
3038
+ .peers-list {
3039
+ display: flex;
3040
+ flex-direction: column;
3041
+ gap: 8px;
3042
+ }
3043
+
3044
+ .peer-empty {
3045
+ color: var(--text-muted);
3046
+ font-size: 13px;
3047
+ padding: 16px;
3048
+ text-align: center;
3049
+ }
3050
+
3051
+ .peer-item {
3052
+ display: flex;
3053
+ align-items: center;
3054
+ gap: 12px;
3055
+ padding: 12px;
3056
+ background: var(--bg-secondary);
3057
+ border: 1px solid var(--border);
3058
+ border-radius: var(--radius);
3059
+ }
3060
+
3061
+ .peer-status {
3062
+ display: flex;
3063
+ align-items: center;
3064
+ gap: 6px;
3065
+ }
3066
+
3067
+ .peer-status .dot {
3068
+ width: 8px;
3069
+ height: 8px;
3070
+ border-radius: 50%;
3071
+ }
3072
+
3073
+ .peer-status .dot.online {
3074
+ background: var(--success);
3075
+ box-shadow: 0 0 6px var(--success);
3076
+ }
3077
+
3078
+ .peer-status .dot.offline {
3079
+ background: var(--text-muted);
3080
+ }
3081
+
3082
+ .peer-status .dot.connecting {
3083
+ background: var(--warning);
3084
+ animation: pulse 1s infinite;
3085
+ }
3086
+
3087
+ .peer-info {
3088
+ flex: 1;
3089
+ }
3090
+
3091
+ .peer-name {
3092
+ font-weight: 500;
3093
+ margin-bottom: 2px;
3094
+ }
3095
+
3096
+ .peer-meta {
3097
+ font-size: 12px;
3098
+ color: var(--text-secondary);
3099
+ }
3100
+
3101
+ .peer-actions {
3102
+ display: flex;
3103
+ gap: 8px;
3104
+ }
3105
+
3106
+ .peer-actions button {
3107
+ padding: 6px 12px;
3108
+ font-size: 12px;
3109
+ }
3110
+
3111
+ /* Messages Section */
3112
+ .p2p-messages-toolbar {
3113
+ margin-bottom: 12px;
3114
+ display: flex;
3115
+ justify-content: flex-end;
3116
+ }
3117
+
3118
+ .messages-list {
3119
+ display: flex;
3120
+ flex-direction: column;
3121
+ gap: 8px;
3122
+ max-height: 400px;
3123
+ overflow-y: auto;
3124
+ }
3125
+
3126
+ .messages-empty {
3127
+ color: var(--text-muted);
3128
+ font-size: 13px;
3129
+ padding: 32px;
3130
+ text-align: center;
3131
+ }
3132
+
3133
+ .message-item {
3134
+ padding: 12px;
3135
+ background: var(--bg-secondary);
3136
+ border: 1px solid var(--border);
3137
+ border-radius: var(--radius);
3138
+ }
3139
+
3140
+ .message-header {
3141
+ display: flex;
3142
+ align-items: center;
3143
+ gap: 8px;
3144
+ margin-bottom: 8px;
3145
+ }
3146
+
3147
+ .message-sender {
3148
+ font-weight: 500;
3149
+ }
3150
+
3151
+ .message-time {
3152
+ font-size: 12px;
3153
+ color: var(--text-secondary);
3154
+ }
3155
+
3156
+ .message-content {
3157
+ font-size: 14px;
3158
+ line-height: 1.5;
3159
+ }
3160
+
3161
+ .message-unread {
3162
+ border-left: 3px solid var(--accent);
3163
+ }
3164
+
3165
+ /* Offline Queue */
3166
+ .offline-queue {
3167
+ margin-top: 20px;
3168
+ padding: 16px;
3169
+ background: var(--bg-secondary);
3170
+ border: 1px solid var(--warning);
3171
+ border-radius: var(--radius);
3172
+ }
3173
+
3174
+ .offline-queue h4 {
3175
+ color: var(--warning);
3176
+ margin-bottom: 12px;
3177
+ }
3178
+
3179
+ .queue-list {
3180
+ display: flex;
3181
+ flex-direction: column;
3182
+ gap: 8px;
3183
+ }
3184
+
3185
+ .queue-item {
3186
+ display: flex;
3187
+ align-items: center;
3188
+ gap: 12px;
3189
+ padding: 10px;
3190
+ background: var(--bg-hover);
3191
+ border-radius: var(--radius);
3192
+ font-size: 13px;
3193
+ }
3194
+
3195
+ .queue-item-content {
3196
+ flex: 1;
3197
+ overflow: hidden;
3198
+ text-overflow: ellipsis;
3199
+ white-space: nowrap;
3200
+ }
3201
+
3202
+ .queue-item-status {
3203
+ display: flex;
3204
+ align-items: center;
3205
+ gap: 6px;
3206
+ }
3207
+
3208
+ .queue-item-status .retry-count {
3209
+ background: var(--warning);
3210
+ color: var(--bg-primary);
3211
+ padding: 2px 6px;
3212
+ border-radius: 4px;
3213
+ font-size: 11px;
3214
+ }
3215
+
3216
+ .queue-item-status .status-pending {
3217
+ color: var(--warning);
3218
+ }
3219
+
3220
+ .queue-item-status .status-failed {
3221
+ color: var(--error);
3222
+ }
3223
+
3224
+ .queue-retry-btn {
3225
+ padding: 4px 8px;
3226
+ font-size: 12px;
3227
+ background: var(--accent);
3228
+ color: var(--bg-primary);
3229
+ border: none;
3230
+ border-radius: 4px;
3231
+ cursor: pointer;
3232
+ }
3233
+
3234
+ /* Modal Small */
3235
+ .modal-sm {
3236
+ max-width: 300px !important;
3237
+ }
3238
+
3239
+ /* Toast */
3240
+ .toast {
3241
+ position: fixed;
3242
+ bottom: 20px;
3243
+ left: 50%;
3244
+ transform: translateX(-50%);
3245
+ padding: 12px 24px;
3246
+ background: var(--bg-secondary);
3247
+ border: 1px solid var(--accent);
3248
+ border-radius: var(--radius);
3249
+ color: var(--text-primary);
3250
+ font-size: 14px;
3251
+ z-index: 9999;
3252
+ animation: toastFade 2s ease forwards;
3253
+ }
3254
+
3255
+ @keyframes toastFade {
3256
+ 0% { opacity: 0; transform: translateX(-50%) translateY(20px); }
3257
+ 10% { opacity: 1; transform: translateX(-50%) translateY(0); }
3258
+ 80% { opacity: 1; }
3259
+ 100% { opacity: 0; }
3260
+ }