@bolloon/bolloon-agent 0.4.14 → 0.4.16

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 (213) hide show
  1. package/README.md +127 -127
  2. package/bin/bolloon-cli.cjs +183 -183
  3. package/bin/bolloon-daemon.sh +207 -0
  4. package/bin/bolloon.cjs +0 -0
  5. package/dist/agents/constraint-layer.js +19 -19
  6. package/dist/agents/judgment-protocol.js +14 -14
  7. package/dist/agents/pi-sdk-types.js +12 -12
  8. package/dist/agents/pi-sdk.js +101 -101
  9. package/dist/agents/skill-organizer.js +19 -19
  10. package/dist/agents/workflow-pivot-loop.js +2 -2
  11. package/dist/agents/x402/x402Pay.js +4 -0
  12. package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
  13. package/dist/bollharness-integration/context-router-judgment.js +4 -4
  14. package/dist/bollharness-integration/context-router.js +292 -292
  15. package/dist/bollharness-integration/gate-state-machine.js +13 -13
  16. package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
  17. package/dist/bollharness-integration/skill-adapter.js +21 -21
  18. package/dist/bootstrap/chat-archiver.js +14 -14
  19. package/dist/bootstrap/context-os.js +24 -24
  20. package/dist/bootstrap/memory-compressor.js +13 -13
  21. package/dist/cli-entry.js +36 -36
  22. package/dist/constraint-runtime/reference_data/archive_surface_snapshot.json +63 -0
  23. package/dist/constraint-runtime/reference_data/commands_snapshot.json +1037 -0
  24. package/dist/constraint-runtime/reference_data/subsystems/assistant.json +8 -0
  25. package/dist/constraint-runtime/reference_data/subsystems/bootstrap.json +8 -0
  26. package/dist/constraint-runtime/reference_data/subsystems/bridge.json +32 -0
  27. package/dist/constraint-runtime/reference_data/subsystems/buddy.json +13 -0
  28. package/dist/constraint-runtime/reference_data/subsystems/cli.json +26 -0
  29. package/dist/constraint-runtime/reference_data/subsystems/components.json +32 -0
  30. package/dist/constraint-runtime/reference_data/subsystems/constants.json +28 -0
  31. package/dist/constraint-runtime/reference_data/subsystems/coordinator.json +8 -0
  32. package/dist/constraint-runtime/reference_data/subsystems/entrypoints.json +15 -0
  33. package/dist/constraint-runtime/reference_data/subsystems/hooks.json +32 -0
  34. package/dist/constraint-runtime/reference_data/subsystems/keybindings.json +21 -0
  35. package/dist/constraint-runtime/reference_data/subsystems/memdir.json +15 -0
  36. package/dist/constraint-runtime/reference_data/subsystems/migrations.json +18 -0
  37. package/dist/constraint-runtime/reference_data/subsystems/moreright.json +8 -0
  38. package/dist/constraint-runtime/reference_data/subsystems/native_ts.json +11 -0
  39. package/dist/constraint-runtime/reference_data/subsystems/outputStyles.json +8 -0
  40. package/dist/constraint-runtime/reference_data/subsystems/plugins.json +9 -0
  41. package/dist/constraint-runtime/reference_data/subsystems/remote.json +11 -0
  42. package/dist/constraint-runtime/reference_data/subsystems/schemas.json +8 -0
  43. package/dist/constraint-runtime/reference_data/subsystems/screens.json +10 -0
  44. package/dist/constraint-runtime/reference_data/subsystems/server.json +10 -0
  45. package/dist/constraint-runtime/reference_data/subsystems/services.json +32 -0
  46. package/dist/constraint-runtime/reference_data/subsystems/skills.json +27 -0
  47. package/dist/constraint-runtime/reference_data/subsystems/state.json +13 -0
  48. package/dist/constraint-runtime/reference_data/subsystems/types.json +18 -0
  49. package/dist/constraint-runtime/reference_data/subsystems/upstreamproxy.json +9 -0
  50. package/dist/constraint-runtime/reference_data/subsystems/utils.json +32 -0
  51. package/dist/constraint-runtime/reference_data/subsystems/vim.json +12 -0
  52. package/dist/constraint-runtime/reference_data/subsystems/voice.json +8 -0
  53. package/dist/constraint-runtime/reference_data/tools_snapshot.json +922 -0
  54. package/dist/context-compaction/auto-compact.js +7 -7
  55. package/dist/electron/config.js.map +1 -0
  56. package/dist/electron/dialogs.js.map +1 -0
  57. package/dist/electron/first-run.js +54 -54
  58. package/dist/electron/first-run.js.map +1 -0
  59. package/dist/electron/ipc.js.map +1 -0
  60. package/dist/electron/logger.js.map +1 -0
  61. package/dist/electron/main.js.map +1 -0
  62. package/dist/electron/menu.js.map +1 -0
  63. package/dist/electron/paths.js.map +1 -0
  64. package/dist/electron/server.js.map +1 -0
  65. package/dist/electron/tray.js.map +1 -0
  66. package/dist/electron/window.js.map +1 -0
  67. package/dist/electron-build/electron/first-run.js +54 -54
  68. package/dist/electron-preload.js.map +1 -1
  69. package/dist/electron.js.map +1 -1
  70. package/dist/index.js +112 -112
  71. package/dist/llm/llm-judgment-client.js +102 -102
  72. package/dist/llm/pi-ai.js +48 -48
  73. package/dist/llm/system-prompt/layers/channel/human-async.md +41 -41
  74. package/dist/llm/system-prompt/layers/channel/local.md +14 -14
  75. package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
  76. package/dist/llm/system-prompt/layers/channel/p2p-peer-sync.md +51 -51
  77. package/dist/llm/system-prompt/layers/channel/p2p-proactive.md +43 -43
  78. package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
  79. package/dist/llm/system-prompt/layers/channel/session-handoff.md +61 -61
  80. package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
  81. package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
  82. package/dist/llm/system-prompt/layers/core/external-engagement.md +73 -73
  83. package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
  84. package/dist/llm/system-prompt/layers/core/identity.md +48 -48
  85. package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
  86. package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
  87. package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
  88. package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
  89. package/dist/llm/system-prompt/layers/core/tone.md +31 -31
  90. package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
  91. package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
  92. package/dist/llm/system-prompt/layers/role/architect.md +20 -20
  93. package/dist/llm/system-prompt/layers/role/expert.md +19 -19
  94. package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
  95. package/dist/llm/system-prompt/layers/role/security.md +15 -15
  96. package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
  97. package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
  98. package/dist/llm/system-prompt/layers/tool/goal_handoff.md +77 -77
  99. package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
  100. package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
  101. package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
  102. package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
  103. package/dist/llm/system-prompt/layers/tool/p2p_request.md +61 -61
  104. package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
  105. package/dist/llm/tool-manifest/ask_user_input.js +1 -1
  106. package/dist/llm/tool-manifest/bash.js +3 -3
  107. package/dist/llm/tool-manifest/create_file.js +4 -4
  108. package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
  109. package/dist/llm/tool-manifest/image_search.js +2 -2
  110. package/dist/llm/tool-manifest/index.js +59 -0
  111. package/dist/llm/tool-manifest/mcp.js +2 -2
  112. package/dist/llm/tool-manifest/message_compose.js +3 -3
  113. package/dist/llm/tool-manifest/places.js +2 -2
  114. package/dist/llm/tool-manifest/present_files.js +1 -1
  115. package/dist/llm/tool-manifest/recipe.js +2 -2
  116. package/dist/llm/tool-manifest/str_replace.js +5 -5
  117. package/dist/llm/tool-manifest/view.js +3 -3
  118. package/dist/llm/tool-manifest/weather.js +4 -4
  119. package/dist/llm/tool-manifest/web.js +4 -4
  120. package/dist/network/p2p.js +78 -4
  121. package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
  122. package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
  123. package/dist/pi-ecosystem-judgment/distillation.js +14 -14
  124. package/dist/pi-ecosystem-judgment/index.js +1 -1
  125. package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
  126. package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
  127. package/dist/security/context-router-tool.js +15 -15
  128. package/dist/utils/auto-update.js.map +1 -0
  129. package/dist/web/a2ui-client.js +1594 -223
  130. package/dist/web/api-config.html +779 -779
  131. package/dist/web/client-hearth.js +10 -10
  132. package/dist/web/client.js.map +7 -0
  133. package/dist/web/components/wallet-viem.mjs +118 -118
  134. package/dist/web/index.html +502 -502
  135. package/dist/web/manifest.json +20 -20
  136. package/dist/web/mobile-agent.js +397 -0
  137. package/dist/web/mobile-core.js +86235 -0
  138. package/dist/web/mobile-data.js +346 -0
  139. package/dist/web/mobile-http-api.js +71 -0
  140. package/dist/web/mobile-p2p.js +250 -0
  141. package/dist/web/mobile-payments.js +80 -0
  142. package/dist/web/mobile-wallet.js +226 -0
  143. package/dist/web/mobile.css +483 -6
  144. package/dist/web/mobile.html +99 -50
  145. package/dist/web/mobile.js +1040 -187
  146. package/dist/web/server.js +13 -13
  147. package/dist/web/style.css +4946 -4946
  148. package/package.json +186 -198
  149. package/scripts/build-cli.js +215 -215
  150. package/scripts/build-web.ts +162 -149
  151. package/scripts/postinstall.js +152 -152
  152. package/bin/bolloon.js +0 -157
  153. package/dist/agents/python-exec.js +0 -115
  154. package/dist/pi-ecosystem-colony/index.js +0 -365
  155. package/dist/social/ant-colony/AdaptiveHeartbeat.js +0 -101
  156. package/dist/social/ant-colony/PheromoneEngine.js +0 -227
  157. package/dist/social/ant-colony/index.js +0 -6
  158. package/dist/social/ant-colony/types.js +0 -24
  159. package/dist/storage/trajectory.js +0 -101
  160. package/dist/test/ai-judgment-test.js +0 -80
  161. package/dist/test/bollharness-integration.test.js +0 -318
  162. package/dist/test/channel-agent-multi-dialogue.js +0 -205
  163. package/dist/test/channel-heartbeat-agent-test.js +0 -201
  164. package/dist/test/constraint-layer.test.js +0 -164
  165. package/dist/test/diap-identity-test.js +0 -172
  166. package/dist/test/diap-quick-test.js +0 -62
  167. package/dist/test/global-shared-context.test.js +0 -315
  168. package/dist/test/harness-judgment-injection.test.js +0 -246
  169. package/dist/test/harness-workflow-integrator-test.js +0 -228
  170. package/dist/test/human-value-store.test.js +0 -243
  171. package/dist/test/hybrid-integration-test.js +0 -118
  172. package/dist/test/hybrid-messenger-verify.js +0 -55
  173. package/dist/test/iroh-bistream-debug.js +0 -38
  174. package/dist/test/iroh-communication.test.js +0 -66
  175. package/dist/test/iroh-debug-test.js +0 -57
  176. package/dist/test/iroh-diap-test.js +0 -71
  177. package/dist/test/iroh-direct-connect.js +0 -55
  178. package/dist/test/iroh-e2e-fixed.js +0 -89
  179. package/dist/test/iroh-e2e-same-process.js +0 -63
  180. package/dist/test/iroh-e2e.js +0 -66
  181. package/dist/test/iroh-final-e2e.js +0 -72
  182. package/dist/test/iroh-relay-test.js +0 -37
  183. package/dist/test/iroh-simple-test.js +0 -41
  184. package/dist/test/iroh-transport-verify.js +0 -54
  185. package/dist/test/iroh-transport.test.js +0 -37
  186. package/dist/test/iroh-two-nodes.js +0 -70
  187. package/dist/test/iroh-verify.js +0 -44
  188. package/dist/test/judgment-decision.test.js +0 -219
  189. package/dist/test/llm-judgment-integration.test.js +0 -220
  190. package/dist/test/p2p-agent-complex-dialogue.js +0 -385
  191. package/dist/test/p2p-agent-dialogue.js +0 -341
  192. package/dist/test/p2p-agent-full-bidirectional.js +0 -510
  193. package/dist/test/p2p-agent-harness-flow.js +0 -437
  194. package/dist/test/p2p-agent-harness-single.js +0 -143
  195. package/dist/test/p2p-ai-dialogue-test.js +0 -318
  196. package/dist/test/p2p-cid-connect-test.js +0 -195
  197. package/dist/test/p2p-connect-receiver.js +0 -69
  198. package/dist/test/p2p-doc-transfer.js +0 -110
  199. package/dist/test/p2p-identity-page-test.js +0 -77
  200. package/dist/test/p2p-iroh-test.js +0 -171
  201. package/dist/test/p2p-minimal-test.js +0 -241
  202. package/dist/test/p2p-node-1.js +0 -148
  203. package/dist/test/p2p-node-2.js +0 -148
  204. package/dist/test/p2p-server.js +0 -281
  205. package/dist/test/p2p-two-nodes-test.js +0 -438
  206. package/dist/test/pi-sdk.test.js +0 -44
  207. package/dist/test/set-persona.js +0 -40
  208. package/dist/test/simple.test.js +0 -9
  209. package/dist/test/storage-integration.test.js +0 -150
  210. package/dist/test/subagent-manager.test.js +0 -276
  211. package/dist/test/test-gate-flow.test.js +0 -81
  212. package/dist/test/workflow-engine.test.js +0 -87
  213. package/dist/test/workflow-pivot-loop.test.js +0 -246
@@ -1,4 +1,4 @@
1
- /* 手机端 UI — 微信风格 + bolloon WebUI 主题 (配色不变) */
1
+ /* 手机端 UI — bolloon 品牌风格 (暗色 + 品牌绿) */
2
2
  :root {
3
3
  --bg: #1a1a18;
4
4
  --bg-card: #222220;
@@ -19,7 +19,7 @@ html, body { height: 100%; }
19
19
  body {
20
20
  background: var(--bg);
21
21
  color: var(--text);
22
- font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
22
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
23
23
  overflow: hidden;
24
24
  touch-action: manipulation;
25
25
  }
@@ -53,8 +53,8 @@ body {
53
53
  }
54
54
 
55
55
  /* 页面容器 */
56
- .page-container { flex: 1; overflow-y: auto; -webkit-overflow-scrolling: touch; }
57
- .page { min-height: 100%; }
56
+ .page-container { flex: 1; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; }
57
+ .page { flex: 1; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; }
58
58
 
59
59
  /* 列表 */
60
60
  .list { padding: 8px 0; }
@@ -98,21 +98,49 @@ body {
98
98
  .conv-name { font-size: 16px; color: var(--text); }
99
99
  .conv-preview { font-size: 13px; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
100
100
 
101
- /* 我 tab 卡片 */
101
+ /* 我 tab 卡片 → 顶部身份栏 */
102
102
  .profile-card {
103
103
  display: flex; align-items: center; gap: 14px;
104
104
  padding: 20px 16px;
105
105
  background: var(--bg-card);
106
106
  border-bottom: 1px solid var(--border);
107
+ cursor: pointer;
107
108
  }
108
109
  .avatar {
109
- width: 56px; height: 56px; border-radius: 12px;
110
+ width: 60px; height: 60px; border-radius: 50%;
110
111
  background: var(--accent); color: var(--bg);
111
112
  display: flex; align-items: center; justify-content: center;
112
113
  font-size: 24px; font-weight: 700;
114
+ background-size: cover; background-position: center;
115
+ flex-shrink: 0; cursor: pointer;
113
116
  }
117
+ .profile-info { flex: 1; min-width: 0; }
114
118
  .profile-name { font-size: 18px; font-weight: 600; }
115
119
  .profile-did { font-size: 12px; color: var(--text-muted); word-break: break-all; margin-top: 4px; }
120
+ .profile-p2p { font-size: 11px; color: var(--text-secondary); word-break: break-all; margin-top: 2px; font-family: 'JetBrains Mono', monospace; }
121
+ .profile-chevron { color: var(--text-muted); font-size: 22px; }
122
+
123
+ /* 身份介绍页 */
124
+ .identity-page { position: fixed; inset: 0; z-index: 70; display: flex; flex-direction: column; background: var(--bg); }
125
+ .identity-page[hidden] { display: none !important; }
126
+ .identity-header { height: var(--topbar-h); display: flex; align-items: center; padding: 0 12px; padding-top: env(safe-area-inset-top); border-bottom: 1px solid var(--border); gap: 8px; background: var(--bg-card); }
127
+ .identity-body { flex: 1; overflow-y: auto; padding: 20px; display: flex; flex-direction: column; gap: 16px; }
128
+ .identity-row { display: flex; flex-direction: column; gap: 4px; padding: 12px; border: 1px solid var(--border); border-radius: 10px; background: var(--bg-card); }
129
+ .identity-row .k { font-size: 12px; color: var(--text-secondary); }
130
+ .identity-row .v { font-size: 14px; color: var(--text); word-break: break-all; }
131
+
132
+ /* 头像裁剪 */
133
+ .crop-modal { position: fixed; inset: 0; z-index: 90; display: flex; flex-direction: column; background: rgba(0,0,0,0.92); }
134
+ .crop-modal[hidden] { display: none !important; }
135
+ .crop-stage { flex: 1; position: relative; overflow: hidden; touch-action: none; }
136
+ .crop-img { position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); max-width: none; user-select: none; -webkit-user-select: none; }
137
+ .crop-box { position: absolute; width: 70vw; height: 70vw; max-width: 340px; max-height: 340px; top: 50%; left: 50%; transform: translate(-50%,-50%); border: 2px dashed var(--accent); box-shadow: 0 0 0 100vmax rgba(0,0,0,0.55); }
138
+ .crop-zoom-row { padding: 14px 20px calc(14px + env(safe-area-inset-bottom)); display: flex; align-items: center; gap: 14px; background: rgba(0,0,0,0.6); }
139
+ .crop-zoom-row input[type=range] { flex: 1; }
140
+ .crop-actions { display: flex; gap: 10px; padding: 0 20px 20px; background: rgba(0,0,0,0.6); }
141
+ .crop-actions button { flex: 1; padding: 13px; border: none; border-radius: 10px; font-weight: 700; }
142
+ .crop-cancel { background: rgba(255,255,255,0.15); color: #fff; }
143
+ .crop-confirm { background: var(--accent); color: var(--bg); }
116
144
 
117
145
  /* 底部 tab */
118
146
  .tabbar {
@@ -134,6 +162,74 @@ body {
134
162
  .tab.active { color: var(--accent); }
135
163
  .tab-icon { font-size: 20px; }
136
164
 
165
+ /* 首页创建新会话栏 (底部中央, tab 上方, 悬浮) */
166
+ .create-session-btn {
167
+ position: fixed;
168
+ bottom: calc(var(--tabbar-h) + 14px + env(safe-area-inset-bottom));
169
+ left: 50%; transform: translateX(-50%);
170
+ z-index: 20;
171
+ padding: 12px 22px;
172
+ border: none; border-radius: 30px;
173
+ background: var(--accent); color: var(--bg);
174
+ font-size: 15px; font-weight: 700;
175
+ box-shadow: 0 4px 18px rgba(0,0,0,0.35);
176
+ cursor: pointer;
177
+ }
178
+ .create-session-btn:active { transform: translateX(-50%) scale(0.97); }
179
+
180
+ /* 底部滑入/滑出 sheet */
181
+ .sheet {
182
+ position: fixed; inset: 0;
183
+ z-index: 80;
184
+ display: flex; align-items: flex-end; justify-content: center;
185
+ background: rgba(0,0,0,0.45);
186
+ transition: opacity .25s;
187
+ }
188
+ .sheet[hidden] { display: none !important; }
189
+ .sheet-inner {
190
+ width: 100%; max-width: 480px;
191
+ background: var(--bg-card);
192
+ border-top-left-radius: 18px; border-top-right-radius: 18px;
193
+ border: 1px solid var(--border); border-bottom: none;
194
+ padding: 20px 20px calc(20px + env(safe-area-inset-bottom));
195
+ display: flex; flex-direction: column; align-items: center; gap: 14px;
196
+ animation: sheetUp .28s ease;
197
+ }
198
+ @keyframes sheetUp { from { transform: translateY(100%); } to { transform: translateY(0); } }
199
+ .sheet-title { font-size: 16px; font-weight: 600; color: var(--text); }
200
+ .sheet-text { font-size: 14px; color: var(--text-secondary); }
201
+ .spinner {
202
+ width: 44px; height: 44px;
203
+ border: 4px solid var(--border);
204
+ border-top-color: var(--accent);
205
+ border-radius: 50%;
206
+ animation: spin .8s linear infinite;
207
+ }
208
+ @keyframes spin { to { transform: rotate(360deg); } }
209
+ .sheet-choice {
210
+ width: 100%; padding: 14px;
211
+ border: none; border-radius: 12px;
212
+ background: var(--bg-hover); color: var(--text);
213
+ font-size: 15px; font-weight: 600;
214
+ text-align: center; cursor: pointer;
215
+ }
216
+ .sheet-choice:active { background: var(--border); }
217
+ .sheet-choice.sheet-cancel { background: transparent; color: var(--text-secondary); }
218
+ .sheet-inner-choices { gap: 10px; }
219
+
220
+ /* 钱包 */
221
+ .wallet-addr {
222
+ text-align: center;
223
+ font-size: 13px;
224
+ color: var(--text-secondary);
225
+ word-break: break-all;
226
+ padding: 10px;
227
+ background: var(--bg-hover);
228
+ border: 1px solid var(--border);
229
+ border-radius: 10px;
230
+ font-family: 'JetBrains Mono', monospace;
231
+ }
232
+
137
233
  /* 聊天页 */
138
234
  .chat-page {
139
235
  position: fixed; inset: 0;
@@ -149,6 +245,7 @@ body {
149
245
  border-bottom: 1px solid var(--border);
150
246
  gap: 8px;
151
247
  }
248
+ .chat-topbar .icon-btn { position: relative; z-index: 5; }
152
249
  .chat-messages { flex: 1; overflow-y: auto; padding: 12px; }
153
250
  .chat-input-bar {
154
251
  display: flex; gap: 8px; padding: 8px 12px;
@@ -171,3 +268,383 @@ body {
171
268
  .bubble { max-width: 75%; padding: 8px 12px; border-radius: 10px; margin: 4px 0; word-break: break-word; }
172
269
  .bubble.user { margin-left: auto; background: var(--accent); color: var(--bg); }
173
270
  .bubble.ai { background: var(--bg-card); color: var(--text); }
271
+
272
+ /* ============ 回复气泡操作栏 (复制/点踩/分享/刷新/分支) ============ */
273
+ .reply-actions {
274
+ display: flex; gap: 6px; margin-top: 6px; flex-wrap: wrap;
275
+ }
276
+ .reply-actions .ra-btn {
277
+ font-size: 12px;
278
+ padding: 3px 9px;
279
+ border: 1px solid var(--border);
280
+ border-radius: 14px;
281
+ background: var(--bg);
282
+ color: var(--text-secondary);
283
+ cursor: pointer;
284
+ line-height: 1.2;
285
+ }
286
+ .reply-actions .ra-btn:active { background: var(--bg-card); }
287
+ .reply-actions .ra-vote-like { color: #4caf50; border-color: #4caf50; }
288
+ .reply-actions .ra-vote-dis { color: #e5484d; border-color: #e5484d; }
289
+
290
+ /* ============ Agent Loop 循环状态 ============ */
291
+ .loop-status-bar {
292
+ display: flex;
293
+ align-items: center;
294
+ gap: 10px;
295
+ padding: 10px 16px;
296
+ background: linear-gradient(180deg, var(--accent-glow) 0%, transparent 100%);
297
+ border-bottom: 1px solid var(--border);
298
+ font-size: 13px;
299
+ color: var(--text-secondary);
300
+ font-family: 'JetBrains Mono', monospace;
301
+ animation: loopStatusFadeIn 0.3s ease-out;
302
+ }
303
+ .loop-status-bar[hidden] { display: none !important; }
304
+ @keyframes loopStatusFadeIn {
305
+ from { opacity: 0; transform: translateY(-4px); }
306
+ to { opacity: 1; transform: translateY(0); }
307
+ }
308
+ .loop-status-spinner {
309
+ width: 16px; height: 16px;
310
+ border: 2px solid var(--border);
311
+ border-top-color: var(--accent);
312
+ border-right-color: var(--accent-hover);
313
+ border-radius: 50%;
314
+ animation: loopStatusSpin 0.9s cubic-bezier(0.4, 0, 0.2, 1) infinite;
315
+ flex-shrink: 0;
316
+ }
317
+ @keyframes loopStatusSpin {
318
+ to { transform: rotate(360deg); }
319
+ }
320
+ .loop-status-text {
321
+ flex: 1;
322
+ background: linear-gradient(90deg, var(--text-secondary) 0%, var(--accent) 50%, var(--text-secondary) 100%);
323
+ background-size: 200% 100%;
324
+ -webkit-background-clip: text;
325
+ background-clip: text;
326
+ color: transparent;
327
+ -webkit-text-fill-color: transparent;
328
+ animation: loopStatusTextShimmer 2.4s linear infinite;
329
+ }
330
+ @keyframes loopStatusTextShimmer {
331
+ 0% { background-position: 200% 0; }
332
+ 100% { background-position: -200% 0; }
333
+ }
334
+
335
+ /* ============ Agent 工作记录 = 执行轨迹 (放在回复区, 不折叠) ============ */
336
+ .agent-trace {
337
+ margin: 6px 0 6px 4px;
338
+ padding: 8px 10px;
339
+ border-left: 2px solid var(--accent);
340
+ background: var(--bg-card);
341
+ border-radius: 8px;
342
+ max-height: 34vh;
343
+ overflow-y: auto;
344
+ }
345
+ .agent-trace-line {
346
+ font-family: 'JetBrains Mono', monospace;
347
+ font-size: 12px;
348
+ color: var(--text-secondary);
349
+ line-height: 1.5;
350
+ word-break: break-word;
351
+ white-space: pre-wrap;
352
+ padding: 1px 0;
353
+ }
354
+ .agent-trace-line:first-child { color: var(--text); }
355
+
356
+ /* ============ 双频滑动卡片 (主页面) ============ */
357
+
358
+ .card-carousel {
359
+ flex: 1;
360
+ overflow: hidden;
361
+ position: relative;
362
+ touch-action: pan-x pan-y;
363
+ }
364
+
365
+ .card-track {
366
+ display: flex;
367
+ flex-direction: column; /* 上下翻卡 */
368
+ gap: 16px;
369
+ padding: 16px;
370
+ overflow-y: auto;
371
+ overflow-x: hidden;
372
+ scroll-snap-type: y mandatory;
373
+ -webkit-overflow-scrolling: touch;
374
+ scroll-behavior: smooth;
375
+ height: 100%;
376
+ align-items: stretch;
377
+ touch-action: pan-y; /* 垂直交给原生滚动翻卡, 水平交给 JS 做删除 reveal */
378
+ }
379
+
380
+ .card-track::-webkit-scrollbar { display: none; }
381
+
382
+ /* 每张卡片外层: 纵向单元 + 删除位 */
383
+ .card-wrap {
384
+ flex: 0 0 100%;
385
+ scroll-snap-align: center;
386
+ position: relative;
387
+ border-radius: 16px;
388
+ overflow: hidden;
389
+ min-height: 0;
390
+ }
391
+ .card-delete {
392
+ position: absolute; right: 0; top: 0; bottom: 0;
393
+ width: 88px;
394
+ background: #e5484d; color: #fff;
395
+ border: none; font-size: 15px; font-weight: 700;
396
+ z-index: 3;
397
+ display: flex; align-items: center; justify-content: center;
398
+ cursor: pointer;
399
+ opacity: 0; pointer-events: none; /* 未 reveal 时隐藏且不可点, 避免遮挡 */
400
+ transition: opacity 0.15s;
401
+ }
402
+ .card-wrap.reveal-delete .card-delete { opacity: 1; pointer-events: auto; }
403
+ .card-wrap.reveal-delete .agent-card { transform: translateX(-24px); }
404
+
405
+ .agent-card {
406
+ position: relative; z-index: 2;
407
+ flex: none; width: 100%; height: 100%;
408
+ background: var(--bg-card);
409
+ border: 1px solid var(--border);
410
+ border-radius: 16px;
411
+ overflow: hidden;
412
+ cursor: grab;
413
+ touch-action: pan-y; /* 横向交给 JS */
414
+ display: flex;
415
+ flex-direction: column;
416
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
417
+ user-select: none;
418
+ -webkit-user-select: none;
419
+ }
420
+
421
+ .agent-card:active { cursor: grabbing; }
422
+ .agent-card:hover { transform: translateY(-2px); box-shadow: 0 4px 20px rgba(0,0,0,0.3); }
423
+
424
+ .agent-card.active-card {
425
+ border-color: var(--accent);
426
+ box-shadow: 0 0 0 1px var(--accent), 0 4px 24px rgba(196, 214, 64, 0.15);
427
+ }
428
+
429
+ /* 卡片封面区域 (水平频) */
430
+ .card-cover {
431
+ position: relative;
432
+ height: 40vh;
433
+ min-height: 200px;
434
+ display: flex;
435
+ align-items: center;
436
+ justify-content: center;
437
+ overflow: hidden;
438
+ }
439
+
440
+ .card-cover img {
441
+ width: 100%;
442
+ height: 100%;
443
+ object-fit: cover;
444
+ }
445
+
446
+ .card-cover-placeholder {
447
+ width: 100%;
448
+ height: 100%;
449
+ display: flex;
450
+ align-items: center;
451
+ justify-content: center;
452
+ font-size: 48px;
453
+ background: linear-gradient(135deg, var(--accent) 0%, var(--accent-dark) 100%);
454
+ color: var(--bg);
455
+ }
456
+
457
+ .card-cover-info {
458
+ position: absolute;
459
+ bottom: 0;
460
+ left: 0;
461
+ right: 0;
462
+ padding: 16px;
463
+ background: linear-gradient(transparent, rgba(0,0,0,0.8));
464
+ color: #fff;
465
+ }
466
+
467
+ .card-cover-name {
468
+ font-size: 20px;
469
+ font-weight: 700;
470
+ margin-bottom: 4px;
471
+ }
472
+
473
+ .card-cover-desc {
474
+ font-size: 13px;
475
+ opacity: 0.8;
476
+ }
477
+
478
+ /* 卡片详情区域 (垂直频) */
479
+ .card-body {
480
+ flex: 1;
481
+ overflow-y: auto;
482
+ -webkit-overflow-scrolling: touch;
483
+ padding: 16px;
484
+ }
485
+
486
+ .card-body-row {
487
+ display: flex;
488
+ align-items: center;
489
+ gap: 10px;
490
+ padding: 10px 0;
491
+ border-bottom: 1px solid var(--border);
492
+ }
493
+
494
+ .card-body-row:last-child { border-bottom: none; }
495
+
496
+ .card-body-label {
497
+ font-size: 12px;
498
+ color: var(--text-muted);
499
+ min-width: 60px;
500
+ }
501
+
502
+ .card-body-value {
503
+ font-size: 14px;
504
+ color: var(--text);
505
+ flex: 1;
506
+ }
507
+
508
+ .card-action-btn {
509
+ width: 100%;
510
+ padding: 12px;
511
+ border: 1px solid var(--accent);
512
+ border-radius: 10px;
513
+ background: transparent;
514
+ color: var(--accent);
515
+ font-size: 14px;
516
+ font-weight: 600;
517
+ cursor: pointer;
518
+ margin-top: 12px;
519
+ transition: background 0.2s;
520
+ }
521
+
522
+ .card-action-btn:active {
523
+ background: var(--accent);
524
+ color: var(--bg);
525
+ }
526
+
527
+ /* 卡片指示器 */
528
+ .card-indicator {
529
+ display: flex;
530
+ justify-content: center;
531
+ gap: 8px;
532
+ padding: 12px;
533
+ background: var(--bg-card);
534
+ border-top: 1px solid var(--border);
535
+ }
536
+
537
+ .card-dot {
538
+ width: 8px;
539
+ height: 8px;
540
+ border-radius: 50%;
541
+ background: var(--border);
542
+ transition: all 0.2s;
543
+ }
544
+
545
+ .card-dot.active {
546
+ background: var(--accent);
547
+ width: 24px;
548
+ border-radius: 4px;
549
+ }
550
+
551
+ /* 卡片详情浮层 */
552
+ .card-detail {
553
+ position: fixed;
554
+ inset: 0;
555
+ background: var(--bg);
556
+ z-index: 50;
557
+ display: flex;
558
+ flex-direction: column;
559
+ overflow: hidden;
560
+ }
561
+
562
+ .card-detail[hidden] { display: none !important; }
563
+
564
+ .detail-header {
565
+ height: var(--topbar-h);
566
+ display: flex;
567
+ align-items: center;
568
+ padding: 0 16px;
569
+ gap: 12px;
570
+ background: var(--bg-card);
571
+ border-bottom: 1px solid var(--border);
572
+ }
573
+
574
+ .detail-header h2 {
575
+ font-size: 18px;
576
+ font-weight: 600;
577
+ flex: 1;
578
+ }
579
+
580
+ .detail-body {
581
+ flex: 1;
582
+ overflow-y: auto;
583
+ -webkit-overflow-scrolling: touch;
584
+ padding: 16px;
585
+ }
586
+
587
+ .detail-section {
588
+ margin-bottom: 20px;
589
+ }
590
+
591
+ .detail-section-title {
592
+ font-size: 12px;
593
+ color: var(--text-muted);
594
+ text-transform: uppercase;
595
+ letter-spacing: 0.5px;
596
+ margin-bottom: 8px;
597
+ }
598
+
599
+ .detail-meta {
600
+ display: grid;
601
+ grid-template-columns: 1fr 1fr;
602
+ gap: 8px;
603
+ }
604
+
605
+ .detail-meta-item {
606
+ background: var(--bg-card);
607
+ border: 1px solid var(--border);
608
+ border-radius: 8px;
609
+ padding: 12px;
610
+ }
611
+
612
+ .detail-meta-item .label {
613
+ font-size: 11px;
614
+ color: var(--text-muted);
615
+ }
616
+
617
+ .detail-meta-item .value {
618
+ font-size: 14px;
619
+ color: var(--text);
620
+ margin-top: 4px;
621
+ }
622
+
623
+ /* 聊天页 (在详情浮层内) */
624
+ .chat-page {
625
+ position: fixed; inset: 0;
626
+ display: flex; flex-direction: column;
627
+ background: var(--bg);
628
+ z-index: 60;
629
+ }
630
+
631
+ /* 加载状态 */
632
+ .card-loading {
633
+ display: flex;
634
+ align-items: center;
635
+ justify-content: center;
636
+ height: 100%;
637
+ color: var(--text-muted);
638
+ font-size: 14px;
639
+ }
640
+
641
+ .card-empty {
642
+ display: flex;
643
+ align-items: center;
644
+ justify-content: center;
645
+ height: 100%;
646
+ color: var(--text-muted);
647
+ font-size: 14px;
648
+ flex-direction: column;
649
+ gap: 8px;
650
+ }