@agentunion/kite 1.5.0 → 1.6.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 (573) hide show
  1. package/.claude/skills/kite/checklists/feature-checklist.md +496 -0
  2. package/.claude/skills/kite/references/event-patterns.md +180 -0
  3. package/.claude/skills/kite/references/health-check.md +202 -0
  4. package/.claude/skills/kite/references/http-service.md +199 -0
  5. package/.claude/skills/kite/references/module-md-spec.md +172 -0
  6. package/.claude/skills/kite/references/multi-connection.md +147 -0
  7. package/.claude/skills/kite/references/rpc-patterns.md +199 -0
  8. package/.claude/skills/kite/references/shutdown-sequence.md +146 -0
  9. package/.claude/skills/kite/references/stdin-protocol.md +147 -0
  10. package/.claude/skills/kite/references/test-center-integration.md +178 -0
  11. package/.claude/skills/kite/references/ws-lifecycle.md +301 -0
  12. package/.claude/skills/kite/skill.md +272 -0
  13. package/.claude/skills/kite/templates/go/README.md +20 -0
  14. package/.claude/skills/kite/templates/node/entry.js +134 -0
  15. package/.claude/skills/kite/templates/node/module.md +16 -0
  16. package/.claude/skills/kite/templates/node/server.js +351 -0
  17. package/.claude/skills/kite/templates/node/server_http.js +90 -0
  18. package/.claude/skills/kite/templates/python/entry.py +425 -0
  19. package/.claude/skills/kite/templates/python/module.md +26 -0
  20. package/.claude/skills/kite/templates/python/server.py +447 -0
  21. package/.claude/skills/kite/templates/python/server_http.py +433 -0
  22. package/cli.js +38 -4
  23. package/core/env_checker.py +96 -0
  24. package/docs/05-/347/237/255/344/277/241/350/256/244/350/257/201/344/270/216/347/224/250/346/210/267/344/277/241/346/201/257/346/216/245/345/217/243/346/226/207/346/241/243.md +507 -0
  25. package/docs/ACP/345/215/217/350/256/256/345/205/274/345/256/271/346/226/271/346/241/210.md +138 -0
  26. package/docs/CI/344/270/216AI/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/346/226/271/346/241/210.md +75 -0
  27. package/docs/CLI/345/274/200/345/217/221/350/256/241/345/210/222.md +595 -0
  28. package/docs/ClaudeCode/350/277/234/347/250/213/345/215/217/344/275/234/347/263/273/347/273/237-/346/212/200/346/234/257/350/257/204/344/274/260.md +535 -0
  29. package/docs/ClaudeCode/350/277/234/347/250/213/345/215/217/344/275/234/347/263/273/347/273/237/350/256/276/350/256/241.md +631 -0
  30. package/docs/Evol-App/344/275/277/347/224/250KernelClient/346/224/271/351/200/240/345/256/214/346/210/220.md +342 -0
  31. package/docs/Evol/346/216/247/345/210/266/345/217/260/346/217/222/344/273/266/345/214/226/346/236/266/346/236/204/346/246/202/350/246/201.md +604 -0
  32. package/docs/Evol/346/216/247/345/210/266/345/217/260/346/217/222/344/273/266/345/214/226/346/236/266/346/236/204/350/256/276/350/256/241.md +1708 -0
  33. package/docs/Evol/346/250/241/345/235/227/350/256/276/350/256/241/346/226/271/346/241/210.md +1154 -0
  34. package/docs/Evol/351/241/265/351/235/242/346/217/222/344/273/266/345/214/226-Evol/346/250/241/345/235/227/345/256/236/346/226/275/346/214/207/345/215/227.md +403 -0
  35. package/docs/Evol/351/241/265/351/235/242/346/217/222/344/273/266/345/214/226-/345/244/226/351/203/250/346/250/241/345/235/227/346/216/245/345/205/245/346/214/207/345/215/227.md +468 -0
  36. package/docs/HTTP-RPC/350/277/201/347/247/273/345/210/260WebSocket/350/256/241/345/210/222.md +318 -0
  37. package/docs/INDEX.md +388 -0
  38. package/docs/KITE_DOCS_GUIDE.md +33 -0
  39. package/docs/Kernel-Client-Kite-Token/346/224/257/346/214/201/345/256/236/346/226/275/345/256/214/346/210/220.md +330 -0
  40. package/docs/Kernel/344/270/273/345/212/250Ping/346/234/272/345/210/266-/346/255/243/347/241/256/345/256/236/347/216/260.md +235 -0
  41. package/docs/Kernel/344/270/273/345/212/250Ping/346/234/272/345/210/266/345/256/236/346/226/275/346/200/273/347/273/223.md +204 -0
  42. package/docs/Kite/345/256/211/350/243/205/351/227/256/351/242/230/350/247/243/345/206/263/346/226/271/346/241/210.md +362 -0
  43. package/docs/Kite/346/216/247/345/210/266/345/217/260/346/217/222/344/273/266/345/214/226/346/236/266/346/236/204/350/256/276/350/256/241-/347/273/210/346/236/201/347/233/256/346/240/207.md +721 -0
  44. package/docs/Kite/346/216/247/345/210/266/345/217/260/347/273/237/344/270/200WebSocket/346/224/271/351/200/240/346/226/271/346/241/210.md +821 -0
  45. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/01-/346/241/206/346/236/266/345/256/232/344/275/215.md +12 -0
  46. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/02-/346/240/270/345/277/203/346/246/202/345/277/265.md +341 -0
  47. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/03-/347/263/273/347/273/237/346/236/266/346/236/204.md +257 -0
  48. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/04-/346/250/241/345/235/227/350/247/204/350/214/203.md +263 -0
  49. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/05-/346/240/270/345/277/203/346/265/201/347/250/213-/346/226/260/347/211/210.md +267 -0
  50. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/05-/346/240/270/345/277/203/346/265/201/347/250/213.md +149 -0
  51. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/06-/347/233/256/345/275/225/347/273/223/346/236/204.md +231 -0
  52. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/07-/346/225/260/346/215/256/346/250/241/345/236/213.md +68 -0
  53. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/08-/346/211/251/345/261/225/346/200/247.md +34 -0
  54. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/09-/344/270/216/345/205/267/344/275/223/345/272/224/347/224/250/347/232/204/345/205/263/347/263/273.md +22 -0
  55. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/README.md +46 -0
  56. package/docs/Kite/347/263/273/347/273/237/345/220/257/345/212/250/346/265/201/347/250/213.md +567 -0
  57. package/docs/Launcher/345/220/257/345/212/250/345/231/250/346/226/207/346/241/243.md +745 -0
  58. package/docs/Polyglot/350/277/220/350/241/214/346/227/266/344/270/216Clawdbot/345/205/274/345/256/271/346/200/247/350/256/276/350/256/241.md +321 -0
  59. package/docs/Redis/344/270/216/346/250/241/345/235/227/345/244/232/345/256/236/344/276/213/346/226/271/346/241/210.md +438 -0
  60. package/docs/Relay-Kite-Token/350/256/244/350/257/201/345/256/236/346/226/275/345/256/214/346/210/220.md +178 -0
  61. package/docs/Relay-Token/346/235/203/351/231/220/351/205/215/347/275/256/351/252/214/350/257/201.md +113 -0
  62. package/docs/Watchdog/345/201/245/345/272/267/346/243/200/346/237/245/344/270/216WebSocket-Ping/346/234/272/345/210/266/345/210/206/346/236/220.md +367 -0
  63. package/docs/Watchdog/350/265/204/346/272/220/347/233/221/346/216/247/347/255/226/347/225/245.md +92 -0
  64. package/docs/WebSocket/346/216/245/346/224/266/345/276/252/347/216/257/346/255/273/351/224/201/351/230/262/350/214/203/350/247/204/350/214/203.md +357 -0
  65. package/docs/WebSocket/350/277/236/346/216/245/351/237/247/346/200/247/344/270/216/351/207/215/350/277/236/346/234/272/345/210/266/345/256/214/346/225/264/346/226/271/346/241/210.md +531 -0
  66. package/docs/WebSocket/350/277/236/346/216/245/351/237/247/346/200/247/346/226/271/346/241/210.md +169 -0
  67. package/docs/WebSocket/351/207/215/350/277/236/346/234/272/345/210/266/346/265/213/350/257/225/346/212/245/345/221/212.md +169 -0
  68. package/docs/WebSocket/351/207/215/350/277/236/351/200/200/351/201/277/346/234/272/345/210/266/346/226/271/346/241/210.md +394 -0
  69. package/docs/Web/346/250/241/345/235/227/344/270/216Evol/346/250/241/345/235/227/351/207/215/346/236/204/345/210/206/346/236/220.md +521 -0
  70. package/docs/audit-api-guide.md +68 -0
  71. package/docs/audit-module-design.md +315 -0
  72. package/docs/audit-module-implementation-summary.md +149 -0
  73. package/docs/llm-context-design.md +52 -0
  74. package/docs/llm-test-enhancement-plan.md +970 -0
  75. package/docs/logs-api-guide.md +42 -0
  76. package/docs/npm/345/214/205Python/347/216/257/345/242/203/347/256/241/347/220/206/346/226/271/346/241/210.md +302 -0
  77. package/docs/npm/345/217/221/345/270/203/344/270/216CLI/344/275/277/347/224/250/346/214/207/345/215/227.md +245 -0
  78. package/docs/stdio/344/270/216/347/253/257/345/217/243/345/217/221/347/216/260/351/207/215/346/236/204.md +480 -0
  79. package/docs/web/346/250/241/345/235/227/344/270/255/350/275/254/346/234/215/345/212/241/350/256/276/350/256/241/346/226/271/346/241/210.md +449 -0
  80. package/docs//344/272/213/344/273/266/345/244/204/347/220/206/346/234/272/345/210/266.md +388 -0
  81. package/docs//344/272/213/344/273/266/345/244/204/347/220/206/350/247/204/350/214/203.md +113 -0
  82. package/docs//344/272/213/344/273/266/350/256/242/351/230/205/351/200/232/351/205/215/347/254/246/350/247/204/350/214/203.md +256 -0
  83. package/docs//344/272/213/344/273/266/351/230/237/345/210/227/345/274/271/346/200/247/347/256/241/347/220/206.md +449 -0
  84. package/docs//344/272/244/344/272/222/345/274/217/347/273/210/347/253/257/346/216/247/345/210/266/346/226/271/346/241/210.md +301 -0
  85. package/docs//344/273/243/347/220/206/345/220/257/345/212/250/345/231/250/344/270/216/345/256/271/345/231/250/345/214/226.md +140 -0
  86. package/docs//344/273/243/347/240/201/347/273/237/350/256/241/345/267/245/345/205/267/344/275/277/347/224/250/350/257/264/346/230/216.md +217 -0
  87. package/docs//344/274/230/351/233/205/351/200/200/345/207/272/350/247/204/350/214/203.md +362 -0
  88. package/docs//344/276/235/350/265/226/347/256/241/347/220/206/350/257/264/346/230/216.md +141 -0
  89. package/docs//344/277/256/345/244/215/346/235/203/351/231/220/351/227/256/351/242/230-evol-RPC/346/235/203/351/231/220.md +268 -0
  90. package/docs//345/210/240/351/231/244kernel-client-example/345/256/214/346/210/220.md +309 -0
  91. package/docs//345/210/240/351/231/244ws-management/345/256/214/346/210/220.md +418 -0
  92. package/docs//345/220/257/345/212/250/344/274/230/345/214/226/346/226/271/346/241/210.md +522 -0
  93. package/docs//345/220/257/345/212/250/344/276/235/350/265/226/344/270/216/346/216/222/345/272/217.md +105 -0
  94. package/docs//345/256/211/350/243/205/350/204/232/346/234/254/345/274/200/345/217/221/346/226/207/346/241/243.md +643 -0
  95. package/docs//345/256/214/346/225/264/345/220/257/345/212/250/346/265/201/347/250/213/350/256/276/350/256/241.md +452 -0
  96. package/docs//345/256/236/347/216/260/350/247/204/345/210/222.md +195 -0
  97. package/docs//345/277/203/350/267/263/346/234/272/345/210/266/351/207/215/346/236/204/346/200/273/347/273/223.md +166 -0
  98. package/docs//346/217/241/346/211/213/350/256/244/350/257/201/346/226/271/346/241/210-/345/256/211/345/205/250/345/256/241/346/237/245.md +176 -0
  99. package/docs//346/217/241/346/211/213/350/256/244/350/257/201/346/226/271/346/241/210.md +908 -0
  100. package/docs//346/226/207/346/241/243/346/233/264/346/226/260/346/270/205/345/215/225.md +83 -0
  101. package/docs//346/227/245/345/277/227/344/270/216/345/274/202/345/270/270/345/244/204/347/220/206/350/247/204/350/214/203.md +829 -0
  102. package/docs//346/227/245/345/277/227/350/260/203/350/257/225/345/256/236/346/210/230/346/214/207/345/215/227.md +25 -0
  103. package/docs//346/236/266/346/236/204/345/200/237/351/211/264/346/214/207/345/215/227.md +977 -0
  104. package/docs//346/236/266/346/236/204/346/224/271/351/200/240-/345/256/214/346/210/220/346/200/273/347/273/223.md +440 -0
  105. package/docs//346/236/266/346/236/204/347/216/260/347/212/266/344/270/216/347/273/210/346/236/201/347/233/256/346/240/207/345/257/271/346/257/224/345/210/206/346/236/220.md +508 -0
  106. package/docs//346/250/241/345/235/227/345/244/232/350/277/236/346/216/245/346/216/247/345/210/266/347/255/226/347/225/245.md +220 -0
  107. package/docs//346/250/241/345/235/227/345/256/211/350/243/205/346/234/272/345/210/266/350/256/276/350/256/241.md +500 -0
  108. package/docs//346/250/241/345/235/227/345/274/200/345/217/221/346/214/207/345/215/227.md +1824 -0
  109. package/docs//346/250/241/345/235/227/347/203/255/346/233/264/346/226/260.md +89 -0
  110. package/docs//346/250/241/345/235/227/350/277/234/347/250/213/351/203/250/347/275/262/345/274/200/345/217/221/350/247/204/350/214/203.md +460 -0
  111. package/docs//346/250/241/345/235/227/351/200/200/345/207/272/346/234/272/345/210/266/345/256/214/346/225/264/346/226/271/346/241/210.md +303 -0
  112. package/docs//346/250/241/345/235/227/351/205/215/347/275/256/345/212/240/350/275/275/344/270/216/347/203/255/351/207/215/350/275/275/350/247/204/350/214/203.md +369 -0
  113. package/docs//346/265/213/350/257/225/344/270/255/345/277/203/346/267/273/345/212/240/346/250/241/345/235/227/346/265/213/350/257/225/346/214/207/345/215/227.md +147 -0
  114. package/docs//347/211/210/346/234/254/351/224/201/345/256/232/347/216/257/345/242/203/347/256/241/347/220/206/346/226/271/346/241/210.md +331 -0
  115. package/docs//347/216/257/345/242/203/345/217/230/351/207/217/344/270/216/350/277/220/350/241/214/346/227/266/347/233/256/345/275/225/350/256/276/350/256/241.md +499 -0
  116. package/docs//347/216/257/345/242/203/347/256/241/347/220/206/345/256/214/346/225/264/346/226/271/346/241/210.md +334 -0
  117. package/docs//350/231/232/346/213/237/346/250/241/345/235/227/344/270/255/350/275/254/346/234/215/345/212/241/345/256/214/346/225/264/350/256/276/350/256/241.md +1496 -0
  118. package/docs//350/231/232/346/213/237/347/216/257/345/242/203/345/267/245/344/275/234/345/216/237/347/220/206.md +163 -0
  119. package/docs//350/256/241/345/210/222/347/256/241/347/220/206/345/231/250/344/275/277/347/224/250/346/214/207/345/215/227.md +196 -0
  120. package/docs//350/256/244/350/257/201/346/250/241/345/235/227/344/270/216Gateway/350/256/276/350/256/241/346/226/271/346/241/210.md +765 -0
  121. package/docs//350/277/234/347/250/213/346/250/241/345/235/227/350/256/276/350/256/241-/346/227/247/347/211/210.md +1117 -0
  122. package/docs//350/277/234/347/250/213/346/250/241/345/235/227/350/256/276/350/256/241.md +451 -0
  123. package/docs//351/207/215/346/236/204/346/234/272/345/210/266/346/270/205/345/215/225.md +192 -0
  124. package/docs//351/223/276/350/267/257/350/277/275/350/270/252/346/226/271/346/241/210.md +242 -0
  125. package/docs//351/231/215/347/272/247/347/255/226/347/225/245/350/256/276/350/256/241/346/226/271/346/241/210.md +618 -0
  126. package/extensions/agents/assistant/entry.py +113 -14
  127. package/extensions/agents/assistant/module.md +27 -22
  128. package/extensions/agents/assistant/server.py +291 -105
  129. package/extensions/channels/acp_channel/entry.py +114 -16
  130. package/extensions/channels/acp_channel/module.md +4 -0
  131. package/extensions/channels/acp_channel/server.py +396 -105
  132. package/extensions/channels/phone_channel/__init__.py +1 -0
  133. package/extensions/channels/phone_channel/entry.py +503 -0
  134. package/extensions/channels/phone_channel/module.md +31 -0
  135. package/extensions/channels/phone_channel/server.py +686 -0
  136. package/extensions/event_hub_bench/entry.py +55 -12
  137. package/extensions/event_hub_bench/module.md +27 -27
  138. package/extensions/services/audit/README.md +134 -0
  139. package/extensions/services/audit/collector.py +73 -0
  140. package/extensions/services/audit/entry.py +444 -0
  141. package/extensions/services/audit/module.md +66 -0
  142. package/extensions/services/audit/query_audit.py +111 -0
  143. package/extensions/services/audit/routes/__init__.py +1 -0
  144. package/extensions/services/audit/routes/routes_audit.py +113 -0
  145. package/extensions/services/audit/schemas/__init__.py +5 -0
  146. package/extensions/services/audit/schemas/audit_event.py +92 -0
  147. package/extensions/services/audit/server.py +542 -0
  148. package/extensions/services/audit/storage.py +95 -0
  149. package/extensions/services/auth/entry.py +1054 -0
  150. package/extensions/services/auth/module.md +31 -0
  151. package/extensions/services/auth/token_store.py +185 -0
  152. package/extensions/services/auth/verifiers/evol_account.py +101 -0
  153. package/extensions/services/auth/verifiers/kite_token.py +38 -0
  154. package/extensions/services/auth/verifiers/pairing_code.py +71 -0
  155. package/extensions/services/backup/entry.py +494 -197
  156. package/extensions/services/backup/module.md +4 -2
  157. package/extensions/services/dataclaw/api/__init__.py +0 -0
  158. package/extensions/services/dataclaw/api/admin.py +367 -0
  159. package/extensions/services/dataclaw/api/copyright.py +175 -0
  160. package/extensions/services/dataclaw/api/credits.py +177 -0
  161. package/extensions/services/dataclaw/api/data.py +179 -0
  162. package/extensions/services/dataclaw/api/demands.py +269 -0
  163. package/extensions/services/dataclaw/api/feeds.py +262 -0
  164. package/extensions/services/dataclaw/api/identity.py +505 -0
  165. package/extensions/services/dataclaw/api/notifications.py +104 -0
  166. package/extensions/services/dataclaw/api/reviews.py +138 -0
  167. package/extensions/services/dataclaw/api/search.py +153 -0
  168. package/extensions/services/dataclaw/api/subscriptions.py +157 -0
  169. package/extensions/services/dataclaw/config.json5 +96 -0
  170. package/extensions/services/dataclaw/core/__init__.py +0 -0
  171. package/extensions/services/dataclaw/core/auth.py +95 -0
  172. package/extensions/services/dataclaw/core/config.py +50 -0
  173. package/extensions/services/dataclaw/core/database.py +70 -0
  174. package/extensions/services/dataclaw/entry.py +416 -0
  175. package/extensions/services/dataclaw/gofeed/351/241/271/347/233/256/346/211/200/346/234/211/346/235/203/350/275/254/347/247/273/346/265/201/347/250/213/350/257/264/346/230/216.md +309 -0
  176. package/extensions/services/dataclaw/migrate.py +283 -0
  177. package/extensions/services/dataclaw/models/__init__.py +0 -0
  178. package/extensions/services/dataclaw/module.md +49 -0
  179. package/extensions/services/dataclaw/requirements.txt +18 -0
  180. package/extensions/services/dataclaw/server.py +759 -0
  181. package/extensions/services/dataclaw/services/__init__.py +0 -0
  182. package/extensions/services/dataclaw/services/agent_service.py +132 -0
  183. package/extensions/services/dataclaw/services/credit_service.py +235 -0
  184. package/extensions/services/dataclaw/services/email_service.py +140 -0
  185. package/extensions/services/dataclaw/services/feed_service.py +259 -0
  186. package/extensions/services/dataclaw/services/notification_service.py +209 -0
  187. package/extensions/services/dataclaw/services/oauth_service.py +275 -0
  188. package/extensions/services/dataclaw/services/pricing.py +102 -0
  189. package/extensions/services/dataclaw/services/quality.py +79 -0
  190. package/extensions/services/dataclaw/services/reputation.py +142 -0
  191. package/extensions/services/dataclaw/services/sms_service.py +174 -0
  192. package/extensions/services/dataclaw/static/css/common.css +853 -0
  193. package/extensions/services/dataclaw/static/css/themes/blue.css +42 -0
  194. package/extensions/services/dataclaw/static/css/themes/dark.css +42 -0
  195. package/extensions/services/dataclaw/static/css/themes/light.css +35 -0
  196. package/extensions/services/dataclaw/static/js/api.js +103 -0
  197. package/extensions/services/dataclaw/static/js/common.js +321 -0
  198. package/extensions/services/dataclaw/static/js/i18n.js +95 -0
  199. package/extensions/services/dataclaw/static/js/pages/admin.js +152 -0
  200. package/extensions/services/dataclaw/static/js/pages/dashboard.js +82 -0
  201. package/extensions/services/dataclaw/static/js/pages/feed-detail.js +180 -0
  202. package/extensions/services/dataclaw/static/js/pages/feed-manage.js +158 -0
  203. package/extensions/services/dataclaw/static/js/theme.js +46 -0
  204. package/extensions/services/dataclaw/static/locales/en-US.json +464 -0
  205. package/extensions/services/dataclaw/static/locales/ja-JP.json +464 -0
  206. package/extensions/services/dataclaw/static/locales/zh-CN.json +464 -0
  207. package/extensions/services/dataclaw/templates/admin/index.html +90 -0
  208. package/extensions/services/dataclaw/templates/base.html +136 -0
  209. package/extensions/services/dataclaw/templates/credits/balance.html +106 -0
  210. package/extensions/services/dataclaw/templates/credits/deposit.html +164 -0
  211. package/extensions/services/dataclaw/templates/credits/history.html +90 -0
  212. package/extensions/services/dataclaw/templates/dashboard.html +52 -0
  213. package/extensions/services/dataclaw/templates/demands/create.html +78 -0
  214. package/extensions/services/dataclaw/templates/demands/detail.html +136 -0
  215. package/extensions/services/dataclaw/templates/demands/list.html +94 -0
  216. package/extensions/services/dataclaw/templates/feeds/create.html +95 -0
  217. package/extensions/services/dataclaw/templates/feeds/detail.html +110 -0
  218. package/extensions/services/dataclaw/templates/feeds/list.html +110 -0
  219. package/extensions/services/dataclaw/templates/feeds/manage.html +88 -0
  220. package/extensions/services/dataclaw/templates/index.html +185 -0
  221. package/extensions/services/dataclaw/templates/login.html +246 -0
  222. package/extensions/services/dataclaw/templates/register.html +164 -0
  223. package/extensions/services/dataclaw/templates/settings/notifications.html +96 -0
  224. package/extensions/services/dataclaw/templates/settings/profile.html +167 -0
  225. package/extensions/services/dataclaw/templates/subscriptions/list.html +64 -0
  226. package/extensions/services/dataclaw/tests/__init__.py +0 -0
  227. package/extensions/services/dataclaw/tests/conftest.py +68 -0
  228. package/extensions/services/dataclaw/tests/integration/__init__.py +0 -0
  229. package/extensions/services/dataclaw/tests/integration/test_workflows.py +239 -0
  230. package/extensions/services/dataclaw/tests/unit/__init__.py +0 -0
  231. package/extensions/services/dataclaw/tests/unit/test_admin.py +70 -0
  232. package/extensions/services/dataclaw/tests/unit/test_copyright.py +63 -0
  233. package/extensions/services/dataclaw/tests/unit/test_credits.py +80 -0
  234. package/extensions/services/dataclaw/tests/unit/test_data.py +98 -0
  235. package/extensions/services/dataclaw/tests/unit/test_demands.py +106 -0
  236. package/extensions/services/dataclaw/tests/unit/test_feeds.py +98 -0
  237. package/extensions/services/dataclaw/tests/unit/test_identity.py +88 -0
  238. package/extensions/services/dataclaw/tests/unit/test_notifications.py +36 -0
  239. package/extensions/services/dataclaw/tests/unit/test_reviews.py +68 -0
  240. package/extensions/services/dataclaw/tests/unit/test_search.py +64 -0
  241. package/extensions/services/dataclaw/tests/unit/test_subscriptions.py +65 -0
  242. package/extensions/services/dataclaw/tests/unit/test_system.py +106 -0
  243. package/extensions/services/dataclaw/utils/__init__.py +0 -0
  244. package/extensions/services/dataclaw/utils/crypto.py +38 -0
  245. package/extensions/services/dataclaw/utils/id_generator.py +52 -0
  246. package/extensions/services/dataclaw/ws/__init__.py +0 -0
  247. package/extensions/services/dataclaw/ws/handler.py +163 -0
  248. package/extensions/services/dataclaw//345/215/217/350/256/2561-/351/241/271/347/233/256/346/235/241/344/273/266/346/216/210/346/235/203/344/270/216/350/202/241/346/235/203/345/257/271/344/273/267/345/215/217/350/256/256.md +243 -0
  249. package/extensions/services/dataclaw//345/215/217/350/256/2562-/351/241/271/347/233/256/350/264/255/344/271/260/346/235/203/344/270/216/345/244/226/345/214/205/345/247/224/346/211/230/345/274/200/345/217/221/345/215/217/350/256/256.md +434 -0
  250. package/extensions/services/evol/__init__.py +1 -0
  251. package/extensions/services/evol/async_http.py +551 -0
  252. package/extensions/services/evol/auth_manager.py +602 -443
  253. package/extensions/services/evol/config.json5 +16 -0
  254. package/extensions/services/evol/entry.py +568 -406
  255. package/extensions/services/evol/evol_api.py +969 -173
  256. package/extensions/services/evol/mfa_totp.py +77 -0
  257. package/extensions/services/evol/module.md +150 -32
  258. package/extensions/services/evol/nonce_pool.py +113 -0
  259. package/extensions/services/evol/oauth_manager.py +223 -0
  260. package/extensions/services/evol/pairing.py +3 -2
  261. package/extensions/services/evol/pairing_codes.jsonl +1 -0
  262. package/extensions/services/evol/relay.py +1031 -682
  263. package/extensions/services/evol/relay_config.json5 +85 -67
  264. package/extensions/services/evol/routes/routes_llm.py +231 -0
  265. package/extensions/services/evol/routes/routes_rpc.py +90 -89
  266. package/extensions/services/evol/routes/routes_test.py +11 -4
  267. package/extensions/services/evol/server.py +2426 -875
  268. package/extensions/services/evol/static/assets/CommissionView-Cs_ys6Gm.js +1 -0
  269. package/extensions/services/evol/static/assets/CommissionView-DACet_Oo.css +1 -0
  270. package/extensions/services/evol/static/assets/IframePage-DbO11U9G.js +1 -0
  271. package/extensions/services/evol/static/assets/IframePage-c572lT8i.css +1 -0
  272. package/extensions/services/evol/static/assets/TeamDetailView-DULrGD7k.css +1 -0
  273. package/extensions/services/evol/static/assets/TeamDetailView-gy_MBEqG.js +139 -0
  274. package/extensions/services/evol/static/assets/element-plus-Bd7pZkkM.js +63 -0
  275. package/extensions/services/evol/static/assets/index-CmMONKzG.css +1 -0
  276. package/extensions/services/evol/static/assets/index-D44bBe__.js +2 -0
  277. package/extensions/services/evol/static/assets/vue-vendor-DtF-__I4.js +29 -0
  278. package/extensions/services/evol/static/index.html +16 -781
  279. package/extensions/services/evol/static/logo.png +0 -0
  280. package/extensions/services/evol/stats_manager.py +243 -240
  281. package/extensions/services/evol/web/README.md +89 -0
  282. package/extensions/services/evol/web/build.bat +44 -0
  283. package/extensions/services/evol/web/index.html +13 -0
  284. package/extensions/services/evol/web/package-lock.json +1718 -0
  285. package/extensions/services/evol/web/package.json +26 -0
  286. package/extensions/services/evol/web/public/logo.png +0 -0
  287. package/extensions/services/evol/web/src/App.vue +7 -0
  288. package/extensions/services/evol/web/src/components/layout/AppHeader.vue +202 -0
  289. package/extensions/services/evol/web/src/components/layout/AppLayout.vue +61 -0
  290. package/extensions/services/evol/web/src/components/layout/AppSidebar.vue +115 -0
  291. package/extensions/services/evol/web/src/components/login/LoginPage.vue +271 -0
  292. package/extensions/services/evol/web/src/components/team/AddMemberModal.vue +181 -0
  293. package/extensions/services/evol/web/src/components/team/GroupTreeNode.vue +156 -0
  294. package/extensions/services/evol/web/src/components/team/TeamAlertConfig.vue +221 -0
  295. package/extensions/services/evol/web/src/components/team/TeamBillModal.vue +165 -0
  296. package/extensions/services/evol/web/src/components/team/TeamMembersAndGroups.vue +499 -0
  297. package/extensions/services/evol/web/src/components/team/TeamStatsPanel.vue +907 -0
  298. package/extensions/services/evol/web/src/components/team/TreeNode.vue +331 -0
  299. package/extensions/services/evol/web/src/components/team/stats/StatsExportProgress.vue +44 -0
  300. package/extensions/services/evol/web/src/components/team/stats/StatsHeader.vue +89 -0
  301. package/extensions/services/evol/web/src/components/team/stats/StatsMemberDetail.vue +415 -0
  302. package/extensions/services/evol/web/src/components/team/stats/StatsSummary.vue +42 -0
  303. package/extensions/services/evol/web/src/components/team/stats/helpers.ts +195 -0
  304. package/extensions/services/evol/web/src/components/team/stats/stats.css +741 -0
  305. package/extensions/services/evol/web/src/components/team/stats/useStatsApi.ts +114 -0
  306. package/extensions/services/evol/web/src/components/team/stats/useStatsCharts.ts +242 -0
  307. package/extensions/services/evol/web/src/components/team/stats/useStatsExport.ts +232 -0
  308. package/extensions/services/evol/web/src/composables/useFormatters.ts +42 -0
  309. package/extensions/services/evol/web/src/composables/useTheme.ts +52 -0
  310. package/extensions/services/evol/web/src/env.d.ts +7 -0
  311. package/extensions/services/evol/web/src/i18n/en.ts +361 -0
  312. package/extensions/services/evol/web/src/i18n/index.ts +36 -0
  313. package/extensions/services/evol/web/src/i18n/zh.ts +379 -0
  314. package/extensions/services/evol/web/src/main.ts +21 -0
  315. package/extensions/services/evol/web/src/router/index.ts +81 -0
  316. package/extensions/services/evol/web/src/services/kernel-client.ts +406 -0
  317. package/extensions/services/evol/web/src/stores/auth.ts +189 -0
  318. package/extensions/services/evol/web/src/stores/connection.ts +134 -0
  319. package/extensions/services/evol/web/src/stores/pages.ts +79 -0
  320. package/extensions/services/evol/web/src/styles/base.css +213 -0
  321. package/extensions/services/evol/web/src/styles/variables.css +138 -0
  322. package/extensions/services/evol/web/src/types/rpc.ts +35 -0
  323. package/extensions/services/evol/web/src/types/token.ts +87 -0
  324. package/extensions/services/evol/web/src/views/AccountView.vue +1532 -0
  325. package/extensions/services/evol/web/src/views/AiServiceView.vue +219 -0
  326. package/extensions/services/evol/web/src/views/CommissionView.vue +1220 -0
  327. package/extensions/services/evol/web/src/views/CreditsView.vue +131 -0
  328. package/extensions/services/evol/web/src/views/EndpointView.vue +163 -0
  329. package/extensions/services/evol/web/src/views/IframePage.vue +120 -0
  330. package/extensions/services/evol/web/src/views/TeamDetailView.vue +473 -0
  331. package/extensions/services/evol/web/src/views/TeamView.vue +332 -0
  332. package/extensions/services/evol/web/tsconfig.json +31 -0
  333. package/extensions/services/evol/web/tsconfig.node.json +10 -0
  334. package/extensions/services/evol/web/vite.config.ts +49 -0
  335. package/extensions/services/evolmem/__init__.py +0 -0
  336. package/extensions/services/evolmem/entry.py +387 -0
  337. package/extensions/services/evolmem/hooks/__init__.py +0 -0
  338. package/extensions/services/evolmem/hooks/assistant_stop.py +228 -0
  339. package/extensions/services/evolmem/hooks/common.py +76 -0
  340. package/extensions/services/evolmem/hooks/pre_tool_use.py +56 -0
  341. package/extensions/services/evolmem/hooks/session_end.py +133 -0
  342. package/extensions/services/evolmem/hooks/session_start.py +229 -0
  343. package/extensions/services/evolmem/hooks/user_prompt.py +122 -0
  344. package/extensions/services/evolmem/module.md +48 -0
  345. package/extensions/services/evolmem/prompts/00-server-info.md +28 -0
  346. package/extensions/services/evolmem/prompts/01-behavior.md +46 -0
  347. package/extensions/services/evolmem/prompts/02-summary-format.md +112 -0
  348. package/extensions/services/evolmem/prompts/03-file-query.md +92 -0
  349. package/extensions/services/evolmem/prompts/04-topic-stats.md +11 -0
  350. package/extensions/services/evolmem/prompts/05-recent-topics.md +84 -0
  351. package/extensions/services/evolmem/scripts/__init__.py +0 -0
  352. package/extensions/services/evolmem/scripts/extract_keywords.py +40 -0
  353. package/extensions/services/evolmem/scripts/search_topics.py +91 -0
  354. package/extensions/services/evolmem/server.py +641 -0
  355. package/extensions/services/gateway/entry.py +964 -0
  356. package/extensions/services/gateway/module.md +29 -0
  357. package/extensions/services/gateway/nonce_pool.py +65 -0
  358. package/extensions/services/gateway/relay.py +133 -0
  359. package/extensions/services/gateway/ws_server.py +285 -0
  360. package/extensions/services/kite_console/auth_manager.py +603 -0
  361. package/extensions/services/kite_console/config.json5 +19 -0
  362. package/extensions/services/kite_console/config_loader.py +117 -0
  363. package/extensions/services/kite_console/entry.py +528 -0
  364. package/extensions/services/kite_console/evol_api.py +179 -0
  365. package/extensions/services/kite_console/evol_config.json5 +29 -0
  366. package/extensions/services/kite_console/mfa_totp.py +77 -0
  367. package/extensions/services/kite_console/migrate_tokens.py +122 -0
  368. package/extensions/services/kite_console/module.md +37 -0
  369. package/extensions/services/kite_console/nonce_pool.py +113 -0
  370. package/extensions/services/kite_console/oauth_manager.py +223 -0
  371. package/extensions/services/kite_console/pairing.py +280 -0
  372. package/extensions/services/kite_console/pairing_codes.jsonl +2 -0
  373. package/extensions/services/kite_console/relay.py +1350 -0
  374. package/extensions/services/kite_console/relay_config.json5 +96 -0
  375. package/extensions/services/kite_console/routes/__init__.py +1 -0
  376. package/extensions/services/kite_console/routes/routes_llm.py +231 -0
  377. package/extensions/services/kite_console/routes/routes_proxy.py +115 -0
  378. package/extensions/services/kite_console/routes/routes_rpc.py +89 -0
  379. package/extensions/services/kite_console/routes/routes_test.py +68 -0
  380. package/extensions/services/kite_console/server.py +1742 -0
  381. package/extensions/services/{evol → kite_console}/static/css/style.css +656 -2
  382. package/extensions/services/kite_console/static/index.html +1524 -0
  383. package/extensions/services/{evol → kite_console}/static/js/dialog.js +11 -4
  384. package/extensions/services/kite_console/static/js/evol-app.js +7740 -0
  385. package/extensions/services/{evol/static/js/evol-app.js → kite_console/static/js/evol-app.js.backup} +2777 -1949
  386. package/extensions/services/kite_console/static/js/kernel-client.js +560 -0
  387. package/extensions/services/{evol/static/js/kernel-client.js → kite_console/static/js/kernel-client.js.backup} +41 -3
  388. package/extensions/services/{evol → kite_console}/static/js/registry-tests.js +7 -0
  389. package/extensions/services/kite_console/static/js/tests/ARCHITECTURE.md +67 -0
  390. package/extensions/services/kite_console/static/js/tests/README.md +140 -0
  391. package/extensions/services/kite_console/static/js/tests/index.js +161 -0
  392. package/extensions/services/kite_console/static/js/tests/integration/auth.js +120 -0
  393. package/extensions/services/kite_console/static/js/tests/integration/channel-interaction.js +188 -0
  394. package/extensions/services/kite_console/static/js/tests/integration/elastic-connection.js +115 -0
  395. package/extensions/services/kite_console/static/js/tests/integration/full-workflow.js +43 -0
  396. package/extensions/services/kite_console/static/js/tests/integration/multi-instance.js +304 -0
  397. package/extensions/services/kite_console/static/js/tests/integration/nested-rpc.js +266 -0
  398. package/extensions/services/kite_console/static/js/tests/integration/pingpong.js +25 -0
  399. package/extensions/services/kite_console/static/js/tests/integration/redis.js +227 -0
  400. package/extensions/services/kite_console/static/js/tests/integration/registry-core.js +52 -0
  401. package/extensions/services/kite_console/static/js/tests/integration/remote-deploy.js +85 -0
  402. package/extensions/services/kite_console/static/js/tests/integration/require-init.js +96 -0
  403. package/extensions/services/kite_console/static/js/tests/integration/scaling-control.js +193 -0
  404. package/extensions/services/kite_console/static/js/tests/integration/trace.js +109 -0
  405. package/extensions/services/kite_console/static/js/tests/modules/acp_channel.js +339 -0
  406. package/extensions/services/kite_console/static/js/tests/modules/auth.js +96 -0
  407. package/extensions/services/kite_console/static/js/tests/modules/backup.js +49 -0
  408. package/extensions/services/kite_console/static/js/tests/modules/gateway.js +41 -0
  409. package/extensions/services/kite_console/static/js/tests/modules/kernel.js +90 -0
  410. package/extensions/services/kite_console/static/js/tests/modules/launcher.js +75 -0
  411. package/extensions/services/kite_console/static/js/tests/modules/multi_instance.js +129 -0
  412. package/extensions/services/kite_console/static/js/tests/modules/phone_channel.js +364 -0
  413. package/extensions/services/kite_console/static/js/tests/modules/redis.js +178 -0
  414. package/extensions/services/kite_console/static/js/tests/modules/watchdog.js +60 -0
  415. package/extensions/services/kite_console/static/js/tests/modules/web.js +70 -0
  416. package/extensions/services/kite_console/static/js/tests/test-runner.js +123 -0
  417. package/extensions/services/kite_console/static/js/virtual-list.js +200 -0
  418. package/extensions/services/kite_console/static/test_kernel_client_token.html +352 -0
  419. package/extensions/services/kite_console/stats_manager.py +247 -0
  420. package/extensions/services/logs/README.md +215 -0
  421. package/extensions/services/logs/api_logger.py +37 -0
  422. package/extensions/services/logs/baseline.py +121 -0
  423. package/extensions/services/logs/cleaner.py +76 -0
  424. package/extensions/services/logs/entry.py +449 -0
  425. package/extensions/services/logs/formatter.py +129 -0
  426. package/extensions/services/logs/module.md +38 -0
  427. package/extensions/services/logs/quick_diagnostic.py +128 -0
  428. package/extensions/services/logs/routes/__init__.py +1 -0
  429. package/extensions/services/logs/routes/routes_logs.py +218 -0
  430. package/extensions/services/logs/routes/routes_logs.py.backup +173 -0
  431. package/extensions/services/logs/scanner.py +100 -0
  432. package/extensions/services/logs/searcher.py +263 -0
  433. package/extensions/services/logs/server.py +553 -0
  434. package/extensions/services/logs.zip +0 -0
  435. package/extensions/services/model_service/config.json5 +30 -0
  436. package/extensions/services/model_service/entry.py +620 -171
  437. package/extensions/services/model_service/module.md +11 -2
  438. package/extensions/services/proxy/__init__.py +0 -0
  439. package/extensions/services/proxy/aid_manager.py +419 -0
  440. package/extensions/services/proxy/auth_bridge.py +182 -0
  441. package/extensions/services/proxy/config_store.py +79 -0
  442. package/extensions/services/proxy/entry.py +528 -0
  443. package/extensions/services/proxy/evol/presenter/agentIdPresenter.py +2 -2
  444. package/extensions/services/proxy/evol/presenter/apikeyPresenter.py +18 -28
  445. package/extensions/services/proxy/evol/presenter/configPresenter.py +80 -1127
  446. package/extensions/services/proxy/evol/presenter/userPresenter.py +71 -477
  447. package/extensions/services/proxy/evol/server/claude_proxy_async.py +11 -7
  448. package/extensions/services/proxy/module.md +151 -0
  449. package/extensions/services/proxy/server.py +952 -271
  450. package/extensions/services/redis/ALIGNMENT_CHECKLIST.md +121 -0
  451. package/extensions/services/redis/ALIGNMENT_STATUS.md +548 -0
  452. package/extensions/services/redis/config.json5 +8 -0
  453. package/extensions/services/redis/entry.py +1509 -0
  454. package/extensions/services/redis/entry.py.backup +405 -0
  455. package/extensions/services/redis/module.md +48 -0
  456. package/extensions/services/redis/redis_builtin.py +332 -0
  457. package/extensions/services/redis/redis_external.py +164 -0
  458. package/extensions/services/testUi/entry.py +446 -0
  459. package/extensions/services/testUi/module.md +18 -0
  460. package/extensions/services/testUi/ui/cards.html +131 -0
  461. package/extensions/services/testUi/ui/index.html +22 -0
  462. package/extensions/services/testUi/ui/particles.html +143 -0
  463. package/extensions/services/watchdog/entry.py +1258 -793
  464. package/extensions/services/watchdog/module.md +2 -0
  465. package/extensions/services/watchdog/monitor.py +465 -87
  466. package/extensions/services/web/auth_manager.py +602 -0
  467. package/extensions/services/web/config.json5 +11 -0
  468. package/extensions/services/web/entry.py +598 -478
  469. package/extensions/services/web/mfa_totp.py +77 -0
  470. package/extensions/services/web/module.md +16 -13
  471. package/extensions/services/web/nonce_pool.py +113 -0
  472. package/extensions/services/web/oauth_manager.py +223 -0
  473. package/extensions/services/web/pairing.py +3 -2
  474. package/extensions/services/web/pairing_codes.jsonl +1 -0
  475. package/extensions/services/web/relay.py +442 -63
  476. package/extensions/services/web/relay_config.json5 +1 -2
  477. package/extensions/services/web/routes/routes_rpc.py +6 -6
  478. package/extensions/services/web/server.py +360 -173
  479. package/extensions/services/web/static/index.html +1752 -1738
  480. package/extensions/services/web/static/js/app.js +32 -0
  481. package/extensions/services/web/static/js/kernel-client.js +48 -9
  482. package/extensions/services/web/vendor/bluetooth/audio.py +1 -1
  483. package/extensions/services/web/vendor/config.py +2 -2
  484. package/extensions/services/web/vendor/storage/identity.py +1 -1
  485. package/kernel/entry.py +77 -23
  486. package/kernel/event_hub.py +1122 -74
  487. package/kernel/module.md +2 -1
  488. package/kernel/registry_store.py +208 -11
  489. package/kernel/rpc_router.py +1400 -491
  490. package/kernel/server.py +1021 -134
  491. package/kite_cli/builders/__init__.py +4 -0
  492. package/kite_cli/builders/base.py +67 -0
  493. package/kite_cli/builders/custom.py +31 -0
  494. package/kite_cli/builders/detector.py +56 -0
  495. package/kite_cli/builders/go.py +34 -0
  496. package/kite_cli/builders/gradle.py +41 -0
  497. package/kite_cli/builders/maven.py +36 -0
  498. package/kite_cli/builders/npm.py +44 -0
  499. package/kite_cli/builders/python.py +37 -0
  500. package/kite_cli/commands/BUILD_GUIDE.md +109 -0
  501. package/kite_cli/commands/build.py +142 -0
  502. package/kite_cli/commands/check.py +60 -0
  503. package/kite_cli/commands/config.py +156 -0
  504. package/kite_cli/commands/deps.py +58 -0
  505. package/kite_cli/commands/deps_install.py +7 -7
  506. package/kite_cli/commands/disable.py +162 -0
  507. package/kite_cli/commands/enable.py +162 -0
  508. package/kite_cli/commands/export.py +96 -0
  509. package/kite_cli/commands/import_cmd.py +110 -0
  510. package/kite_cli/commands/install.py +50 -23
  511. package/kite_cli/commands/install_skill.py +107 -0
  512. package/kite_cli/commands/list.py +128 -31
  513. package/kite_cli/commands/outdated.py +202 -0
  514. package/kite_cli/commands/search.py +33 -17
  515. package/kite_cli/commands/update.py +115 -2
  516. package/kite_cli/commands/venv_setup.py +6 -6
  517. package/kite_cli/commands/why.py +48 -0
  518. package/kite_cli/core/config_manager.py +145 -0
  519. package/kite_cli/core/downloader.py +32 -2
  520. package/kite_cli/main.py +151 -5
  521. package/kite_cli/utils/colors.py +153 -0
  522. package/kite_cli/utils/dependency_graph.py +209 -0
  523. package/kite_cli/utils/process.py +55 -0
  524. package/kite_cli/utils/progress.py +207 -0
  525. package/kite_cli/utils/table.py +101 -0
  526. package/launcher/count_lines.py +192 -43
  527. package/launcher/entry.py +4543 -2802
  528. package/launcher/logging_setup.py +54 -1
  529. package/launcher/module.md +32 -6
  530. package/launcher/module_scanner.py +93 -20
  531. package/launcher/process_manager.py +355 -76
  532. package/main.py +6 -0
  533. package/package.json +4 -1
  534. package/requirements.txt +41 -38
  535. package/scripts/auto-fix-deps.py +128 -0
  536. package/scripts/env-manager.js +25 -2
  537. package/scripts/final-test.js +78 -0
  538. package/scripts/setup-python-env.js +700 -191
  539. package/scripts/test-alluser.js +48 -0
  540. package/scripts/test-different-version.js +86 -0
  541. package/scripts/test-direct.js +63 -0
  542. package/scripts/test-extract-installer.js +28 -0
  543. package/scripts/test-install-log.js +54 -0
  544. package/scripts/test-installer.js +39 -0
  545. package/scripts/test-integration.js +250 -0
  546. package/scripts/test-real-install.js +210 -0
  547. package/scripts/test-targetdir.js +49 -0
  548. package/scripts/test-venv-real.js +47 -0
  549. package/scripts/test-venv-simple.js +57 -0
  550. package/scripts/test-wait.js +49 -0
  551. package/scripts/test-with-log.js +63 -0
  552. package/extensions/services/evol/config.yaml +0 -149
  553. package/extensions/services/evol/routes/routes_management_ws.py +0 -127
  554. package/extensions/services/evol/static/index_evol.html +0 -14
  555. package/extensions/services/evol/static/js/app.js +0 -6304
  556. package/extensions/services/evol/static/js/auth.js +0 -326
  557. package/extensions/services/evol/static/js/evol-app-fixed.js +0 -50
  558. package/extensions/services/evol/static/js/evol-app.js.bak +0 -1800
  559. package/extensions/services/evol/static/js/kernel-client-example.js +0 -228
  560. package/extensions/services/evol/static/js/main.js +0 -141
  561. package/extensions/services/evol/static/js/stats.js +0 -217
  562. package/extensions/services/evol/static/js/token-manager.js +0 -175
  563. package/extensions/services/proxy/CHANGELOG_20260308.md +0 -258
  564. package/extensions/services/proxy/_fix_prints.py +0 -133
  565. package/extensions/services/proxy/_fix_prints2.py +0 -87
  566. package/extensions/services/proxy/console_auth.py +0 -109
  567. package/extensions/services/proxy/logs/websocket.log +0 -260
  568. package/extensions/services/proxy/main.py +0 -240
  569. package/extensions/services/proxy/requirements.txt +0 -13
  570. package/extensions/services/web/config.yaml +0 -149
  571. /package/extensions/services/{evol → kite_console}/static/pairing.html +0 -0
  572. /package/extensions/services/{evol → kite_console}/static/test_registry.html +0 -0
  573. /package/extensions/services/{evol → kite_console}/static/test_relay.html +0 -0
@@ -0,0 +1,1532 @@
1
+ <template>
2
+ <div class="account-view">
3
+ <h2 class="page-title">{{ t('account.title') }}</h2>
4
+
5
+ <div v-if="userInfo" class="account-container">
6
+ <!-- 固定头部:个人信息 + 当前团队 -->
7
+ <div class="account-header">
8
+ <div class="user-section">
9
+ <div class="user-avatar">
10
+ <svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
11
+ <path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/>
12
+ <circle cx="12" cy="7" r="4"/>
13
+ </svg>
14
+ </div>
15
+ <div class="user-info">
16
+ <div class="user-name-row">
17
+ <span class="user-name">{{ userInfo.userInfo?.nickName || t('na') }}</span>
18
+ <span class="vip-badge" :class="vipBadgeClass">{{ vipLabel }}</span>
19
+ </div>
20
+ <div class="user-phone">{{ userInfo.userInfo?.phone || t('na') }}</div>
21
+ </div>
22
+ </div>
23
+
24
+ <!-- 团队版:显示团队信息 + 切换按钮 -->
25
+ <div v-if="isInTeam" class="team-section">
26
+ <div class="team-info">
27
+ <div class="team-header">
28
+ <span class="team-label">{{ t('account.currentTeam') }}</span>
29
+ <button v-if="showSwitchButton" class="team-switch-btn" @click="toggleTeamMenu">
30
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
31
+ <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
32
+ <circle cx="9" cy="7" r="4"/>
33
+ <path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
34
+ <path d="M16 3.13a4 4 0 0 1 0 7.75"/>
35
+ </svg>
36
+ <span>{{ switchButtonText }}</span>
37
+ <svg v-if="(currentTeam?.teams?.length || 0) > 1" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
38
+ <polyline points="6 9 12 15 18 9"/>
39
+ </svg>
40
+ </button>
41
+ </div>
42
+ <div class="team-details">
43
+ <span class="team-name">{{ currentTeamDisplay }}</span>
44
+ <span class="team-meta-divider">·</span>
45
+ <span class="team-role">{{ teamRoleDisplay }}</span>
46
+ <span class="team-meta-divider">·</span>
47
+ <span class="team-members">{{ currentTeam.teams?.find(t => t.teamId === currentTeamId)?.memberCount || 0 }} 人</span>
48
+ </div>
49
+ </div>
50
+
51
+ <!-- 团队切换下拉菜单(多个团队时显示) -->
52
+ <div v-if="showTeamMenu && (currentTeam?.teams?.length || 0) > 1" class="team-menu" @click.stop>
53
+ <div
54
+ v-for="team in allTeams"
55
+ :key="team.teamId || 0"
56
+ class="team-menu-item"
57
+ :class="{ active: team.teamId === currentTeamId }"
58
+ @click="handleSwitchTeam(team.teamId)"
59
+ >
60
+ <div class="team-menu-info">
61
+ <div class="team-menu-name">
62
+ <svg v-if="team.teamId === currentTeamId" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3">
63
+ <polyline points="20 6 9 17 4 12"/>
64
+ </svg>
65
+ {{ team.teamName }}
66
+ </div>
67
+ <div v-if="team.teamId" class="team-menu-meta">
68
+ {{ getRoleText(team.memberRole) }} · {{ team.memberCount }} 人
69
+ </div>
70
+ </div>
71
+ </div>
72
+ </div>
73
+ </div>
74
+
75
+ <!-- 个人版:有团队时显示切换按钮 -->
76
+ <div v-else-if="showSwitchButton" class="personal-section">
77
+ <button class="team-switch-btn" @click="toggleTeamMenu">
78
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
79
+ <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
80
+ <circle cx="9" cy="7" r="4"/>
81
+ <path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
82
+ <path d="M16 3.13a4 4 0 0 1 0 7.75"/>
83
+ </svg>
84
+ <span>{{ switchButtonText }}</span>
85
+ <svg v-if="(currentTeam?.teams?.length || 0) > 1" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
86
+ <polyline points="6 9 12 15 18 9"/>
87
+ </svg>
88
+ </button>
89
+
90
+ <!-- 团队切换下拉菜单(多个团队时显示) -->
91
+ <div v-if="showTeamMenu && (currentTeam?.teams?.length || 0) > 1" class="team-menu" @click.stop>
92
+ <div
93
+ v-for="team in allTeams"
94
+ :key="team.teamId || 0"
95
+ class="team-menu-item"
96
+ :class="{ active: team.teamId === currentTeamId }"
97
+ @click="handleSwitchTeam(team.teamId)"
98
+ >
99
+ <div class="team-menu-info">
100
+ <div class="team-menu-name">
101
+ <svg v-if="team.teamId === currentTeamId" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3">
102
+ <polyline points="20 6 9 17 4 12"/>
103
+ </svg>
104
+ {{ team.teamName }}
105
+ </div>
106
+ <div v-if="team.teamId" class="team-menu-meta">
107
+ {{ getRoleText(team.memberRole) }} · {{ team.memberCount }} 人
108
+ </div>
109
+ </div>
110
+ </div>
111
+ </div>
112
+ </div>
113
+ </div>
114
+
115
+ <!-- Tab 切换 -->
116
+ <div class="account-tabs">
117
+ <div class="tab-item" :class="{ active: activeTab === 'overview' }" @click="activeTab = 'overview'">
118
+ {{ t('credits.overview') }}
119
+ </div>
120
+ <div class="tab-item" :class="{ active: activeTab === 'account' }" @click="activeTab = 'account'">
121
+ {{ t('account.accountInfo') }}
122
+ </div>
123
+ <div class="tab-item" :class="{ active: activeTab === 'packages' }" @click="activeTab = 'packages'">
124
+ {{ t('credits.packages') }}
125
+ </div>
126
+ <div class="tab-item" :class="{ active: activeTab === 'orders' }" @click="activeTab = 'orders'">
127
+ {{ t('credits.orders') }}
128
+ </div>
129
+ </div>
130
+
131
+ <!-- Tab 内容 -->
132
+ <div class="tab-content">
133
+ <!-- 账户信息 -->
134
+ <div v-if="activeTab === 'account'" class="tab-panel">
135
+ <div class="info-list">
136
+ <div class="info-row">
137
+ <span class="info-label">{{ t('account.userId') }}</span>
138
+ <span class="info-value">{{ userInfo.userInfo?.userId || t('na') }}</span>
139
+ </div>
140
+ <div class="info-row">
141
+ <span class="info-label">{{ t('account.aid') }}</span>
142
+ <span class="info-value mono">{{ userInfo.userInfo?.aid || t('na') }}</span>
143
+ </div>
144
+ <div class="info-row">
145
+ <span class="info-label">{{ t('account.vipType') }}</span>
146
+ <span class="info-value">{{ userInfo.accountInfo?.vipTypeName || t('account.nonVip') }}</span>
147
+ </div>
148
+ <div class="info-row">
149
+ <span class="info-label">{{ t('account.remainingDays') }}</span>
150
+ <span class="info-value remaining-days">{{ remainingDaysDisplay }}</span>
151
+ </div>
152
+ <div v-if="userInfo.accountInfo?.vipExpireTime" class="info-row">
153
+ <span class="info-label">{{ t('account.expireTime') }}</span>
154
+ <span class="info-value">{{ formatExpireTime(userInfo.accountInfo.vipExpireTime) }}</span>
155
+ </div>
156
+ </div>
157
+ </div>
158
+
159
+ <!-- 积分概览 -->
160
+ <div v-if="activeTab === 'overview'" class="tab-panel overview-panel">
161
+ <!-- 时间范围切换 -->
162
+ <div class="overview-toolbar">
163
+ <div class="period-tabs">
164
+ <button :class="{ active: overviewPeriod === 'today' }" @click="switchOverviewPeriod('today')">{{ t('credits.today') }}</button>
165
+ <button :class="{ active: overviewPeriod === '7d' }" @click="switchOverviewPeriod('7d')">{{ t('credits.last7Days') }}</button>
166
+ <button :class="{ active: overviewPeriod === '30d' }" @click="switchOverviewPeriod('30d')">{{ t('credits.last30Days') }}</button>
167
+ </div>
168
+ </div>
169
+
170
+ <!-- 加载中 -->
171
+ <div v-if="overviewLoading" class="loading">{{ t('common.loading') }}</div>
172
+
173
+ <template v-else>
174
+ <!-- 汇总卡片 -->
175
+ <div class="summary-cards">
176
+ <div class="summary-card">
177
+ <div class="summary-card-label">{{ t('credits.totalCredits') }}</div>
178
+ <div class="summary-card-value primary">{{ summaryData.totalCredits || 0 }}</div>
179
+ </div>
180
+ <div class="summary-card">
181
+ <div class="summary-card-label">{{ t('credits.totalRequests') }}</div>
182
+ <div class="summary-card-value">{{ summaryData.totalCount || 0 }}</div>
183
+ </div>
184
+ <div class="summary-card">
185
+ <div class="summary-card-label">{{ t('credits.totalCost') }}</div>
186
+ <div class="summary-card-value cost">${{ (summaryData.totalCost || 0).toFixed(2) }}</div>
187
+ </div>
188
+ </div>
189
+
190
+ <!-- 按功能类型分布 -->
191
+ <div v-if="hasTypeBreakdown" class="type-breakdown">
192
+ <div v-for="item in typeBreakdownItems" :key="item.key" class="type-bar-row">
193
+ <span class="type-label">{{ t('credits.' + item.key) }}</span>
194
+ <div class="type-bar-track">
195
+ <div class="type-bar-fill" :style="{ width: item.percent + '%', background: item.color }"></div>
196
+ </div>
197
+ <span class="type-value">{{ item.value }}</span>
198
+ </div>
199
+ </div>
200
+
201
+ <!-- 日趋势图(7天/30天时显示) -->
202
+ <div v-if="overviewPeriod !== 'today' && dailyTrendData.length > 0" class="trend-section">
203
+ <div class="section-title">{{ t('credits.dailyTrend') }}</div>
204
+ <div class="bar-chart">
205
+ <div v-for="bar in dailyChartBars" :key="bar.label" class="bar-col">
206
+ <div class="bar-tooltip">{{ bar.value }}</div>
207
+ <div class="bar-track">
208
+ <div class="bar-fill" :style="{ height: bar.percent + '%' }"></div>
209
+ </div>
210
+ <div class="bar-label">{{ bar.label }}</div>
211
+ </div>
212
+ </div>
213
+ </div>
214
+
215
+ <!-- 24小时趋势图 -->
216
+ <div v-if="hourlyTrendData.length > 0" class="trend-section">
217
+ <div class="section-title">{{ t('credits.hourlyTrend') }}</div>
218
+ <div class="bar-chart bar-chart-hourly">
219
+ <div v-for="bar in hourlyChartBars" :key="bar.label" class="bar-col">
220
+ <div class="bar-tooltip">{{ bar.value }}</div>
221
+ <div class="bar-track">
222
+ <div class="bar-fill bar-fill-hourly" :style="{ height: bar.percent + '%' }"></div>
223
+ </div>
224
+ <div class="bar-label">{{ bar.label }}</div>
225
+ </div>
226
+ </div>
227
+ </div>
228
+
229
+ <!-- 无数据提示 -->
230
+ <div v-if="!overviewLoading && !summaryData.totalCredits && recentRecords.length === 0" class="empty">
231
+ {{ t('credits.noTrendData') }}
232
+ </div>
233
+
234
+ <!-- 有明细但无统计数据的提示 -->
235
+ <div v-if="!overviewLoading && !summaryData.totalCredits && recentRecords.length > 0" class="info-tip">
236
+ 统计数据正在生成中,请稍后刷新查看
237
+ </div>
238
+
239
+ <!-- 最近消耗记录 -->
240
+ <div v-if="recentRecords.length > 0" class="trend-section">
241
+ <div class="section-title">{{ t('credits.recentRecords') }}</div>
242
+ <div class="recent-records">
243
+ <div v-for="rec in recentRecords" :key="rec.id" class="record-row">
244
+ <div class="record-main">
245
+ <span class="record-model">{{ rec.model || '-' }}</span>
246
+ <span class="record-type">{{ rec.functionType || '-' }}</span>
247
+ </div>
248
+ <div class="record-meta">
249
+ <span class="record-credits">{{ rec.credits }}</span>
250
+ <span class="record-time">{{ formatRecordTime(rec.createTime) }}</span>
251
+ </div>
252
+ </div>
253
+ </div>
254
+ </div>
255
+ </template>
256
+
257
+ <div v-if="creditsErrorMsg" class="credits-error">{{ creditsErrorMsg }}</div>
258
+ </div>
259
+
260
+ <!-- 积分包 -->
261
+ <div v-if="activeTab === 'packages'" class="tab-panel">
262
+ <div v-if="loadingPackages" class="loading">{{ t('common.loading') }}</div>
263
+ <div v-else-if="packages.length === 0" class="empty">{{ t('credits.noPackages') }}</div>
264
+ <div v-else class="packages-list">
265
+ <div v-for="pkg in packages" :key="pkg.id" class="package-item">
266
+ <div class="package-name">{{ pkg.name }}</div>
267
+ <div class="package-credits">{{ pkg.credits }} {{ t('credits.credits') }}</div>
268
+ </div>
269
+ </div>
270
+ </div>
271
+
272
+ <!-- 订单 -->
273
+ <div v-if="activeTab === 'orders'" class="tab-panel">
274
+ <div v-if="loadingOrders" class="loading">{{ t('common.loading') }}</div>
275
+ <div v-else-if="orders.length === 0" class="empty">{{ t('credits.noOrders') }}</div>
276
+ <div v-else class="orders-list">
277
+ <div v-for="order in orders" :key="order.id" class="order-item">
278
+ <div class="order-info">
279
+ <div class="order-name">{{ order.name || order.packageName || t('credits.unknown') }}</div>
280
+ <div class="order-time">{{ formatTime(order.createTime) }}</div>
281
+ </div>
282
+ <div class="order-status">{{ getOrderStatus(order.status) }}</div>
283
+ </div>
284
+ </div>
285
+ </div>
286
+ </div>
287
+ </div>
288
+
289
+ <div v-else class="loading-panel">
290
+ {{ t('common.loading') }}
291
+ </div>
292
+ </div>
293
+ </template>
294
+
295
+ <script setup lang="ts">
296
+ import { computed, onMounted, ref, watch, onUnmounted } from 'vue'
297
+ import { useAuthStore } from '@/stores/auth'
298
+ import { useConnectionStore } from '@/stores/connection'
299
+ import { useI18n } from '@/i18n'
300
+ import { storeToRefs } from 'pinia'
301
+ import { ElMessage } from 'element-plus'
302
+
303
+ const authStore = useAuthStore()
304
+ const connectionStore = useConnectionStore()
305
+ const { userInfo } = storeToRefs(authStore)
306
+ const { t } = useI18n()
307
+
308
+ const activeTab = ref('overview')
309
+ const showTeamMenu = ref(false)
310
+
311
+ // === 积分统计相关状态 ===
312
+ const todayTotal = ref(0)
313
+ const creditsErrorMsg = ref('')
314
+ const packages = ref<any[]>([])
315
+ const loadingPackages = ref(false)
316
+ const orders = ref<any[]>([])
317
+ const loadingOrders = ref(false)
318
+
319
+ // === 概览页状态 ===
320
+ const overviewPeriod = ref<'today' | '7d' | '30d'>('today')
321
+ const overviewLoading = ref(false)
322
+ const summaryData = ref<any>({})
323
+ const dailyTrendData = ref<any[]>([])
324
+ const hourlyTrendData = ref<any[]>([])
325
+ const recentRecords = ref<any[]>([])
326
+
327
+ const currentTeam = computed(() => userInfo.value?.teamInfo)
328
+ const currentTeamId = computed(() => currentTeam.value?.currentTeamId)
329
+
330
+ const currentTeamDisplay = computed(() => {
331
+ if (!currentTeam.value?.currentTeamId) return t('account.personalVersion')
332
+ return currentTeam.value.currentTeamName || t('na')
333
+ })
334
+
335
+ const allTeams = computed(() => {
336
+ const teams = currentTeam.value?.teams || []
337
+ return [
338
+ { teamId: null, teamName: t('account.personalVersion'), memberRole: null, memberCount: 0 },
339
+ ...teams
340
+ ]
341
+ })
342
+
343
+ // 是否有可用的团队
344
+ const hasTeams = computed(() => {
345
+ const teams = currentTeam.value?.teams || []
346
+ return teams.length > 0
347
+ })
348
+
349
+ // 当前是否在团队版
350
+ const isInTeam = computed(() => {
351
+ return currentTeamId.value != null && currentTeamId.value !== 0
352
+ })
353
+
354
+ // 切换按钮文本
355
+ const switchButtonText = computed(() => {
356
+ if (!hasTeams.value) {
357
+ // 没有团队,不显示按钮
358
+ return ''
359
+ }
360
+
361
+ if (!isInTeam.value) {
362
+ // 个人版,有团队
363
+ return t('account.switchToTeam')
364
+ }
365
+
366
+ // 团队版
367
+ const teams = currentTeam.value?.teams || []
368
+ if (teams.length === 1) {
369
+ // 只有一个团队
370
+ return t('account.switchToPersonal')
371
+ } else {
372
+ // 多个团队
373
+ return t('account.switchTeam')
374
+ }
375
+ })
376
+
377
+ // 是否显示切换按钮
378
+ const showSwitchButton = computed(() => {
379
+ return hasTeams.value
380
+ })
381
+
382
+ const teamRoleDisplay = computed(() => {
383
+ const role = currentTeam.value?.currentTeamRole
384
+ return getRoleText(role)
385
+ })
386
+
387
+ const isVip = computed(() => {
388
+ const name = userInfo.value?.accountInfo?.vipTypeName
389
+ return name && name !== 'Free' && name !== '非VIP'
390
+ })
391
+
392
+ const vipLabel = computed(() => {
393
+ return userInfo.value?.accountInfo?.vipTypeName || 'Free'
394
+ })
395
+
396
+ const vipBadgeClass = computed(() => {
397
+ return isVip.value ? 'vip-badge--active' : 'vip-badge--free'
398
+ })
399
+
400
+ const remainingDaysDisplay = computed(() => {
401
+ const info = userInfo.value?.accountInfo
402
+ if (!isVip.value) return '∞'
403
+ if (info?.vipRemainingDays != null) {
404
+ return t('account.remainingDaysUnit', { n: info.vipRemainingDays })
405
+ }
406
+ return t('na')
407
+ })
408
+
409
+ function getRoleText(role: string | null | undefined): string {
410
+ if (role === '0') return t('account.roleAdmin')
411
+ if (role === '1') return t('account.roleMember')
412
+ if (role === '2') return t('account.roleMember')
413
+ return t('na')
414
+ }
415
+
416
+ function formatExpireTime(timeStr: string): string {
417
+ try {
418
+ const date = new Date(timeStr)
419
+ return date.toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit' })
420
+ } catch {
421
+ return timeStr
422
+ }
423
+ }
424
+
425
+ function toggleTeamMenu() {
426
+ // 如果只有一个团队,直接切换
427
+ const teams = currentTeam.value?.teams || []
428
+ console.log('[AccountView] toggleTeamMenu:', {
429
+ teamsCount: teams.length,
430
+ isInTeam: isInTeam.value,
431
+ currentTeamId: currentTeamId.value,
432
+ teamIds: teams.map((t: any) => t.teamId)
433
+ })
434
+
435
+ if (teams.length === 1 && isInTeam.value) {
436
+ // 团队版 → 个人版
437
+ handleSwitchTeam(null)
438
+ return
439
+ }
440
+
441
+ if (teams.length === 1 && !isInTeam.value) {
442
+ // 个人版 → 团队版(唯一团队)
443
+ handleSwitchTeam(teams[0].teamId)
444
+ return
445
+ }
446
+
447
+ // 多个团队,显示菜单
448
+ showTeamMenu.value = !showTeamMenu.value
449
+ }
450
+
451
+ async function handleSwitchTeam(teamId: number | null | undefined) {
452
+ showTeamMenu.value = false
453
+
454
+ console.log('[AccountView] handleSwitchTeam:', { teamId, currentTeamId: currentTeamId.value })
455
+
456
+ // teamId 为 undefined 说明团队数据异常
457
+ if (teamId === undefined) {
458
+ console.error('[AccountView] teamId is undefined, team data may be corrupted')
459
+ ElMessage.error(t('account.switchTeamFailed'))
460
+ return
461
+ }
462
+
463
+ if (teamId === currentTeamId.value) {
464
+ console.log('[AccountView] Already in target team, skipping')
465
+ return
466
+ }
467
+
468
+ try {
469
+ const client = connectionStore.getClient()
470
+ if (!client) {
471
+ ElMessage.error(t('account.switchTeamFailed'))
472
+ return
473
+ }
474
+
475
+ const result = await client.call('evol.switch_team', { team_id: teamId, kiteToken: authStore.kiteToken })
476
+ console.log('[AccountView] switch_team result:', result)
477
+
478
+ if (result.status === 'success') {
479
+ ElMessage.success(result.data?.data?.message || t('account.switchTeamSuccess'))
480
+ await authStore.loadUserInfo(client)
481
+ } else {
482
+ ElMessage.error(result.error || t('account.switchTeamFailed'))
483
+ }
484
+ } catch (e: any) {
485
+ console.error('Switch team failed:', e)
486
+ ElMessage.error(t('account.switchTeamFailed'))
487
+ }
488
+ }
489
+
490
+ async function tryLoadUserInfo() {
491
+ try {
492
+ const client = connectionStore.getClient()
493
+ if (client && client.authenticated) {
494
+ await authStore.loadUserInfo(client)
495
+ }
496
+ } catch (e: any) {
497
+ console.error('Failed to load user info:', e)
498
+ }
499
+ }
500
+
501
+ // === 功能类型颜色映射 ===
502
+ const typeColors: Record<string, string> = {
503
+ chatbot: '#6366f1',
504
+ codex: '#f59e0b',
505
+ claudecode: '#10b981',
506
+ gemini: '#3b82f6',
507
+ openclaw: '#ef4444',
508
+ }
509
+
510
+ const typeKeys = ['chatbot', 'codex', 'claudecode', 'gemini', 'openclaw'] as const
511
+
512
+ // === 概览相关计算属性 ===
513
+ const hasTypeBreakdown = computed(() => {
514
+ const d = summaryData.value
515
+ return typeKeys.some(k => (d[k + 'Credits'] || 0) > 0)
516
+ })
517
+
518
+ const typeBreakdownItems = computed(() => {
519
+ const d = summaryData.value
520
+ const total = d.totalCredits || 1
521
+ return typeKeys
522
+ .map(k => ({
523
+ key: k,
524
+ value: d[k + 'Credits'] || 0,
525
+ percent: Math.round(((d[k + 'Credits'] || 0) / total) * 100),
526
+ color: typeColors[k],
527
+ }))
528
+ .filter(item => item.value > 0)
529
+ })
530
+
531
+ const dailyChartBars = computed(() => {
532
+ const data = dailyTrendData.value
533
+ if (!data.length) return []
534
+ const max = Math.max(...data.map((d: any) => d.totalCredits || 0), 1)
535
+ return data.map((d: any) => {
536
+ const dateStr = (d.statDate || '').toString()
537
+ const label = dateStr.length >= 10 ? dateStr.slice(5, 10) : dateStr
538
+ return {
539
+ label,
540
+ value: d.totalCredits || 0,
541
+ percent: Math.round(((d.totalCredits || 0) / max) * 100),
542
+ }
543
+ })
544
+ })
545
+
546
+ const hourlyChartBars = computed(() => {
547
+ // 补全24小时
548
+ const map = new Map<number, any>()
549
+ for (const d of hourlyTrendData.value) {
550
+ const hourStr = (d.statHour || '').toString()
551
+ const hour = parseInt(hourStr.slice(11, 13), 10)
552
+ if (!isNaN(hour)) map.set(hour, d)
553
+ }
554
+ const bars = []
555
+ const max = Math.max(...hourlyTrendData.value.map((d: any) => d.totalCredits || 0), 1)
556
+ for (let h = 0; h < 24; h++) {
557
+ const d = map.get(h)
558
+ const val = d?.totalCredits || 0
559
+ bars.push({
560
+ label: String(h),
561
+ value: val,
562
+ percent: Math.round((val / max) * 100),
563
+ })
564
+ }
565
+ return bars
566
+ })
567
+
568
+ function getDateStr(daysAgo: number): string {
569
+ const d = new Date()
570
+ d.setDate(d.getDate() - daysAgo)
571
+ return d.toISOString().slice(0, 10)
572
+ }
573
+
574
+ function formatRecordTime(time: string): string {
575
+ if (!time) return ''
576
+ return time.slice(5, 16).replace('T', ' ')
577
+ }
578
+
579
+ async function switchOverviewPeriod(period: 'today' | '7d' | '30d') {
580
+ overviewPeriod.value = period
581
+ await loadOverviewData()
582
+ }
583
+
584
+ async function loadOverviewData() {
585
+ if (!authStore.kiteToken) return
586
+ if (connectionStore.status !== 'connected') return
587
+
588
+ overviewLoading.value = true
589
+ creditsErrorMsg.value = ''
590
+
591
+ const today = getDateStr(0)
592
+ const period = overviewPeriod.value
593
+
594
+ try {
595
+ const startDate = period === 'today' ? today : period === '7d' ? getDateStr(6) : getDateStr(29)
596
+ const endDate = today
597
+
598
+ // 并行加载汇总 + 趋势 + 最近记录(最近记录固定取今天)
599
+ const [summaryResult, hourlyResult, dailyResult, listResult] = await Promise.all([
600
+ connectionStore.callRpc<any>('evol.get_user_summary', {
601
+ kiteToken: authStore.kiteToken, startDate, endDate,
602
+ }),
603
+ connectionStore.callRpc<any>('evol.get_user_hourly_trend', {
604
+ kiteToken: authStore.kiteToken, date: today,
605
+ }),
606
+ period !== 'today'
607
+ ? connectionStore.callRpc<any>('evol.get_user_daily_trend', {
608
+ kiteToken: authStore.kiteToken, startDate, endDate,
609
+ })
610
+ : Promise.resolve({ success: true, data: [] }),
611
+ connectionStore.callRpc<any>('evol.get_credits_list', {
612
+ kiteToken: authStore.kiteToken, pageNum: 1, pageSize: 10,
613
+ startTime: startDate + ' 00:00:00',
614
+ endTime: endDate + ' 23:59:59',
615
+ }),
616
+ ])
617
+
618
+ if (summaryResult.success) {
619
+ summaryData.value = summaryResult.data || {}
620
+ }
621
+ if (hourlyResult.success) {
622
+ hourlyTrendData.value = hourlyResult.data || []
623
+ }
624
+ if (dailyResult.success) {
625
+ dailyTrendData.value = dailyResult.data || []
626
+ }
627
+ if (listResult.success) {
628
+ recentRecords.value = (listResult.data?.list || []).filter((r: any) => r.changeType === 3)
629
+ }
630
+ } catch (e: any) {
631
+ creditsErrorMsg.value = e.message || t('common.error')
632
+ } finally {
633
+ overviewLoading.value = false
634
+ }
635
+ }
636
+
637
+ // === 积分统计相关方法 ===
638
+ async function loadCreditsStats() {
639
+ if (!authStore.kiteToken) return
640
+ if (connectionStore.status !== 'connected') return
641
+ try {
642
+ const result = await connectionStore.callRpc<any>('evol.get_credits_stats', {
643
+ kiteToken: authStore.kiteToken,
644
+ period: 'day'
645
+ })
646
+ if (result.success) {
647
+ todayTotal.value = result.data?.total || 0
648
+ } else {
649
+ creditsErrorMsg.value = result.msg || t('common.error')
650
+ }
651
+ } catch (e: any) {
652
+ creditsErrorMsg.value = e.message || t('common.error')
653
+ }
654
+ }
655
+
656
+ async function loadPackages() {
657
+ if (!authStore.kiteToken) return
658
+ loadingPackages.value = true
659
+ try {
660
+ const result = await connectionStore.callRpc<any>('evol.get_credits_package_list', {
661
+ kiteToken: authStore.kiteToken
662
+ })
663
+ if (result.success) {
664
+ packages.value = result.data || []
665
+ }
666
+ } catch (e) {
667
+ console.error('Load packages failed:', e)
668
+ } finally {
669
+ loadingPackages.value = false
670
+ }
671
+ }
672
+
673
+ async function loadOrders() {
674
+ if (!authStore.kiteToken) return
675
+ loadingOrders.value = true
676
+ try {
677
+ const result = await connectionStore.callRpc<any>('evol.get_order_list', {
678
+ kiteToken: authStore.kiteToken,
679
+ page: 1,
680
+ pageSize: 50
681
+ })
682
+ if (result.success) {
683
+ orders.value = result.data?.list || []
684
+ }
685
+ } catch (e) {
686
+ console.error('Load orders failed:', e)
687
+ } finally {
688
+ loadingOrders.value = false
689
+ }
690
+ }
691
+
692
+ function formatTime(time: string) {
693
+ if (!time) return ''
694
+ return new Date(time).toLocaleString()
695
+ }
696
+
697
+ function getOrderStatus(status: number) {
698
+ const statusMap: Record<number, string> = {
699
+ 0: t('credits.orderPending'),
700
+ 1: t('credits.orderPaying'),
701
+ 2: t('credits.orderPaid'),
702
+ 3: t('credits.orderFailed'),
703
+ 4: t('credits.orderClosed'),
704
+ 5: t('credits.orderRefunded')
705
+ }
706
+ return statusMap[status] || t('common.unknown')
707
+ }
708
+
709
+ function handleClickOutside(e: MouseEvent) {
710
+ const target = e.target as HTMLElement
711
+ if (!target.closest('.team-section') && !target.closest('.personal-section')) {
712
+ showTeamMenu.value = false
713
+ }
714
+ }
715
+
716
+ onMounted(() => {
717
+ tryLoadUserInfo()
718
+ loadCreditsStats()
719
+ loadOverviewData()
720
+ document.addEventListener('click', handleClickOutside)
721
+ })
722
+
723
+ onUnmounted(() => {
724
+ document.removeEventListener('click', handleClickOutside)
725
+ })
726
+
727
+ watch(() => connectionStore.status, (newStatus) => {
728
+ if (newStatus === 'connected') {
729
+ if (!userInfo.value) setTimeout(tryLoadUserInfo, 500)
730
+ setTimeout(loadCreditsStats, 500)
731
+ setTimeout(loadOverviewData, 500)
732
+ }
733
+ })
734
+
735
+ watch(activeTab, (tab) => {
736
+ if (tab === 'packages' && packages.value.length === 0) loadPackages()
737
+ else if (tab === 'orders' && orders.value.length === 0) loadOrders()
738
+ })
739
+ </script>
740
+
741
+ <style scoped>
742
+ .account-view {
743
+ max-width: 1000px;
744
+ margin: 0 auto;
745
+ }
746
+
747
+ .account-container {
748
+ display: flex;
749
+ flex-direction: column;
750
+ gap: 24px;
751
+ }
752
+
753
+ /* 固定头部 - glass card */
754
+ .account-header {
755
+ background: var(--panel-bg);
756
+ backdrop-filter: var(--panel-blur);
757
+ -webkit-backdrop-filter: var(--panel-blur);
758
+ border-radius: var(--radius-lg);
759
+ padding: 32px;
760
+ box-shadow: var(--panel-shadow);
761
+ border: 1px solid var(--border-color);
762
+ display: flex;
763
+ justify-content: space-between;
764
+ align-items: center;
765
+ gap: 40px;
766
+ position: relative;
767
+ }
768
+
769
+ .user-section {
770
+ display: flex;
771
+ align-items: center;
772
+ gap: 20px;
773
+ flex: 1;
774
+ }
775
+
776
+ .user-avatar {
777
+ width: 64px;
778
+ height: 64px;
779
+ border-radius: 50%;
780
+ background: var(--primary-light);
781
+ color: var(--primary);
782
+ display: flex;
783
+ align-items: center;
784
+ justify-content: center;
785
+ flex-shrink: 0;
786
+ }
787
+
788
+ .user-info {
789
+ display: flex;
790
+ flex-direction: column;
791
+ gap: 6px;
792
+ }
793
+
794
+ .user-name-row {
795
+ display: flex;
796
+ align-items: center;
797
+ gap: 12px;
798
+ }
799
+
800
+ .user-name {
801
+ font-size: 22px;
802
+ font-weight: 700;
803
+ color: var(--text-primary);
804
+ line-height: 1.2;
805
+ }
806
+
807
+ .user-phone {
808
+ font-size: 14px;
809
+ color: var(--text-muted);
810
+ font-family: 'Spline Sans Mono', monospace;
811
+ }
812
+
813
+ .team-section {
814
+ display: flex;
815
+ flex-direction: column;
816
+ gap: 12px;
817
+ position: relative;
818
+ flex: 1;
819
+ max-width: 600px;
820
+ }
821
+
822
+ .personal-section {
823
+ display: flex;
824
+ align-items: center;
825
+ position: relative;
826
+ }
827
+
828
+ .team-info {
829
+ display: flex;
830
+ flex-direction: column;
831
+ gap: 12px;
832
+ }
833
+
834
+ .team-header {
835
+ display: flex;
836
+ align-items: center;
837
+ justify-content: space-between;
838
+ gap: 16px;
839
+ }
840
+
841
+ .team-label {
842
+ font-size: 13px;
843
+ color: var(--text-secondary);
844
+ text-transform: uppercase;
845
+ letter-spacing: 0.05em;
846
+ flex-shrink: 0;
847
+ }
848
+
849
+ .team-details {
850
+ display: flex;
851
+ align-items: center;
852
+ gap: 12px;
853
+ flex-wrap: wrap;
854
+ }
855
+
856
+ .team-name {
857
+ font-size: 18px;
858
+ font-weight: 600;
859
+ color: var(--text-primary);
860
+ flex-shrink: 0;
861
+ }
862
+
863
+ .team-meta-divider {
864
+ color: var(--text-muted);
865
+ font-size: 14px;
866
+ }
867
+
868
+ .team-role {
869
+ color: var(--text-secondary);
870
+ font-size: 15px;
871
+ flex-shrink: 0;
872
+ }
873
+
874
+ .team-members {
875
+ color: var(--text-secondary);
876
+ font-size: 15px;
877
+ flex-shrink: 0;
878
+ }
879
+
880
+ .vip-badge {
881
+ padding: 4px 12px;
882
+ border-radius: var(--radius-pill);
883
+ font-size: 12px;
884
+ font-weight: 600;
885
+ letter-spacing: 0.04em;
886
+ flex-shrink: 0;
887
+ text-transform: uppercase;
888
+ }
889
+
890
+ .vip-badge--free {
891
+ background: var(--btn-ghost-bg);
892
+ color: var(--text-muted);
893
+ }
894
+
895
+ .vip-badge--active {
896
+ background: linear-gradient(135deg, #fbbf24, #f59e0b);
897
+ color: #422006;
898
+ }
899
+
900
+ .team-switch-btn {
901
+ display: flex;
902
+ align-items: center;
903
+ gap: 8px;
904
+ padding: 10px 18px;
905
+ border-radius: var(--radius-pill);
906
+ background: var(--btn-ghost-bg);
907
+ border: 1px solid var(--border-color);
908
+ cursor: pointer;
909
+ font-size: 14px;
910
+ font-weight: 600;
911
+ color: var(--btn-ghost-text);
912
+ transition: all 0.2s;
913
+ font-family: inherit;
914
+ }
915
+
916
+ .team-switch-btn:hover {
917
+ background: var(--border-color);
918
+ transform: translateY(-1px);
919
+ }
920
+
921
+ .team-switch-btn svg {
922
+ transition: transform 0.2s;
923
+ }
924
+
925
+ /* 团队切换菜单 */
926
+ .team-menu {
927
+ position: absolute;
928
+ top: calc(100% + 12px);
929
+ right: 0;
930
+ min-width: 300px;
931
+ background: var(--panel-bg);
932
+ backdrop-filter: var(--panel-blur);
933
+ -webkit-backdrop-filter: var(--panel-blur);
934
+ border-radius: 16px;
935
+ box-shadow: 0 30px 60px rgba(2, 6, 23, 0.4);
936
+ border: 1px solid var(--border-color);
937
+ z-index: 100;
938
+ overflow: hidden;
939
+ }
940
+
941
+ .personal-section .team-menu {
942
+ right: 0;
943
+ }
944
+
945
+ .team-section .team-menu {
946
+ right: 0;
947
+ }
948
+
949
+ .team-menu-item {
950
+ padding: 16px 20px;
951
+ cursor: pointer;
952
+ transition: background 0.2s;
953
+ border-bottom: 1px solid var(--border-light);
954
+ }
955
+
956
+ .team-menu-item:last-child {
957
+ border-bottom: none;
958
+ }
959
+
960
+ .team-menu-item:hover {
961
+ background: var(--bg-secondary);
962
+ }
963
+
964
+ .team-menu-item.active {
965
+ background: var(--primary-light);
966
+ }
967
+
968
+ .team-menu-info {
969
+ display: flex;
970
+ flex-direction: column;
971
+ gap: 6px;
972
+ }
973
+
974
+ .team-menu-name {
975
+ display: flex;
976
+ align-items: center;
977
+ gap: 10px;
978
+ font-size: 15px;
979
+ font-weight: 500;
980
+ color: var(--text-primary);
981
+ }
982
+
983
+ .team-menu-name svg {
984
+ color: var(--primary);
985
+ flex-shrink: 0;
986
+ }
987
+
988
+ .team-menu-meta {
989
+ font-size: 13px;
990
+ color: var(--text-secondary);
991
+ padding-left: 26px;
992
+ }
993
+
994
+ /* Tab 切换 */
995
+ .account-tabs {
996
+ display: flex;
997
+ gap: 8px;
998
+ border-bottom: 1px solid var(--border-color);
999
+ padding: 0;
1000
+ overflow-x: auto;
1001
+ -webkit-overflow-scrolling: touch;
1002
+ scrollbar-width: none;
1003
+ }
1004
+
1005
+ .account-tabs::-webkit-scrollbar {
1006
+ display: none;
1007
+ }
1008
+
1009
+ .tab-item {
1010
+ padding: 12px 20px;
1011
+ text-align: center;
1012
+ font-size: 15px;
1013
+ font-weight: 600;
1014
+ white-space: nowrap;
1015
+ flex-shrink: 0;
1016
+ color: var(--text-muted);
1017
+ cursor: pointer;
1018
+ transition: all 0.2s;
1019
+ border-bottom: 2px solid transparent;
1020
+ position: relative;
1021
+ bottom: -1px;
1022
+ background: transparent;
1023
+ }
1024
+
1025
+ .tab-item:hover {
1026
+ color: var(--text-primary);
1027
+ }
1028
+
1029
+ .tab-item.active {
1030
+ color: var(--primary);
1031
+ border-bottom-color: var(--primary);
1032
+ }
1033
+
1034
+ /* Tab 内容 - glass panel */
1035
+ .tab-content {
1036
+ background: var(--panel-bg);
1037
+ backdrop-filter: var(--panel-blur);
1038
+ -webkit-backdrop-filter: var(--panel-blur);
1039
+ border-radius: var(--radius-lg);
1040
+ padding: 32px;
1041
+ box-shadow: var(--panel-shadow);
1042
+ border: 1px solid var(--border-color);
1043
+ min-height: 400px;
1044
+ }
1045
+
1046
+ .tab-panel {
1047
+ animation: fadeIn 0.3s;
1048
+ }
1049
+
1050
+ @keyframes fadeIn {
1051
+ from {
1052
+ opacity: 0;
1053
+ transform: translateY(8px);
1054
+ }
1055
+ to {
1056
+ opacity: 1;
1057
+ transform: translateY(0);
1058
+ }
1059
+ }
1060
+
1061
+ /* 信息列表 */
1062
+ .info-list {
1063
+ display: flex;
1064
+ flex-direction: column;
1065
+ }
1066
+
1067
+ .info-row {
1068
+ display: flex;
1069
+ justify-content: space-between;
1070
+ align-items: center;
1071
+ padding: 16px 0;
1072
+ border-bottom: 1px solid var(--border-color);
1073
+ }
1074
+
1075
+ .info-row:last-child {
1076
+ border-bottom: none;
1077
+ }
1078
+
1079
+ .info-label {
1080
+ color: var(--text-muted);
1081
+ font-size: 14px;
1082
+ font-weight: 600;
1083
+ text-transform: uppercase;
1084
+ letter-spacing: 0.06em;
1085
+ }
1086
+
1087
+ .info-value {
1088
+ color: var(--text-primary);
1089
+ font-size: 15px;
1090
+ font-weight: 500;
1091
+ text-align: right;
1092
+ }
1093
+
1094
+ .mono {
1095
+ font-family: 'Spline Sans Mono', 'SF Mono', 'Consolas', monospace;
1096
+ font-size: 14px;
1097
+ word-break: break-all;
1098
+ }
1099
+
1100
+ .small {
1101
+ font-size: 13px;
1102
+ }
1103
+
1104
+ .remaining-days {
1105
+ color: var(--warning);
1106
+ font-size: 17px;
1107
+ font-weight: 700;
1108
+ font-family: 'Spline Sans Mono', monospace;
1109
+ }
1110
+
1111
+ .loading-panel {
1112
+ text-align: center;
1113
+ padding: 60px 40px;
1114
+ color: var(--text-muted);
1115
+ background: var(--panel-bg);
1116
+ backdrop-filter: var(--panel-blur);
1117
+ -webkit-backdrop-filter: var(--panel-blur);
1118
+ border-radius: var(--radius-lg);
1119
+ box-shadow: var(--panel-shadow);
1120
+ border: 1px solid var(--border-color);
1121
+ font-size: 15px;
1122
+ }
1123
+
1124
+ @media (max-width: 768px) {
1125
+ .account-header {
1126
+ flex-direction: column;
1127
+ align-items: flex-start;
1128
+ gap: 32px;
1129
+ padding: 32px;
1130
+ }
1131
+
1132
+ .user-section {
1133
+ width: 100%;
1134
+ }
1135
+
1136
+ .team-section,
1137
+ .personal-section {
1138
+ width: 100%;
1139
+ }
1140
+
1141
+ .team-header {
1142
+ flex-direction: column;
1143
+ align-items: flex-start;
1144
+ gap: 12px;
1145
+ }
1146
+
1147
+ .team-switch-btn {
1148
+ width: 100%;
1149
+ justify-content: center;
1150
+ }
1151
+
1152
+ .tab-content {
1153
+ padding: 32px 24px;
1154
+ }
1155
+
1156
+ .info-row {
1157
+ flex-direction: column;
1158
+ align-items: flex-start;
1159
+ gap: 8px;
1160
+ }
1161
+
1162
+ .info-value {
1163
+ text-align: left;
1164
+ }
1165
+ }
1166
+
1167
+ /* === 概览页样式 === */
1168
+ .overview-panel {
1169
+ display: flex;
1170
+ flex-direction: column;
1171
+ gap: 28px;
1172
+ }
1173
+
1174
+ .overview-toolbar {
1175
+ display: flex;
1176
+ justify-content: flex-end;
1177
+ }
1178
+
1179
+ .period-tabs {
1180
+ display: flex;
1181
+ gap: 4px;
1182
+ background: var(--btn-ghost-bg);
1183
+ border-radius: var(--radius-pill);
1184
+ padding: 3px;
1185
+ }
1186
+
1187
+ .period-tabs button {
1188
+ padding: 6px 16px;
1189
+ border: none;
1190
+ border-radius: var(--radius-pill);
1191
+ background: transparent;
1192
+ color: var(--text-muted);
1193
+ font-size: 13px;
1194
+ font-weight: 600;
1195
+ cursor: pointer;
1196
+ transition: all 0.2s;
1197
+ font-family: inherit;
1198
+ }
1199
+
1200
+ .period-tabs button:hover {
1201
+ color: var(--text-primary);
1202
+ }
1203
+
1204
+ .period-tabs button.active {
1205
+ background: var(--primary);
1206
+ color: #fff;
1207
+ }
1208
+
1209
+ /* 汇总卡片 */
1210
+ .summary-cards {
1211
+ display: grid;
1212
+ grid-template-columns: repeat(3, 1fr);
1213
+ gap: 16px;
1214
+ }
1215
+
1216
+ .summary-card {
1217
+ background: var(--btn-ghost-bg);
1218
+ border-radius: var(--radius);
1219
+ padding: 20px;
1220
+ border: 1px solid var(--border-color);
1221
+ text-align: center;
1222
+ }
1223
+
1224
+ .summary-card-label {
1225
+ font-size: 12px;
1226
+ font-weight: 600;
1227
+ color: var(--text-muted);
1228
+ text-transform: uppercase;
1229
+ letter-spacing: 0.06em;
1230
+ margin-bottom: 8px;
1231
+ }
1232
+
1233
+ .summary-card-value {
1234
+ font-size: 28px;
1235
+ font-weight: 700;
1236
+ font-family: 'Spline Sans Mono', monospace;
1237
+ color: var(--text-primary);
1238
+ }
1239
+
1240
+ .summary-card-value.primary {
1241
+ color: var(--primary);
1242
+ }
1243
+
1244
+ .summary-card-value.cost {
1245
+ color: var(--warning);
1246
+ }
1247
+
1248
+ /* 功能类型分布 */
1249
+ .type-breakdown {
1250
+ display: flex;
1251
+ flex-direction: column;
1252
+ gap: 10px;
1253
+ }
1254
+
1255
+ .type-bar-row {
1256
+ display: flex;
1257
+ align-items: center;
1258
+ gap: 12px;
1259
+ }
1260
+
1261
+ .type-label {
1262
+ font-size: 13px;
1263
+ font-weight: 600;
1264
+ color: var(--text-secondary);
1265
+ width: 100px;
1266
+ flex-shrink: 0;
1267
+ text-align: right;
1268
+ }
1269
+
1270
+ .type-bar-track {
1271
+ flex: 1;
1272
+ height: 8px;
1273
+ background: var(--btn-ghost-bg);
1274
+ border-radius: 4px;
1275
+ overflow: hidden;
1276
+ }
1277
+
1278
+ .type-bar-fill {
1279
+ height: 100%;
1280
+ border-radius: 4px;
1281
+ transition: width 0.5s ease;
1282
+ }
1283
+
1284
+ .type-value {
1285
+ font-size: 13px;
1286
+ font-weight: 600;
1287
+ font-family: 'Spline Sans Mono', monospace;
1288
+ color: var(--text-primary);
1289
+ width: 60px;
1290
+ flex-shrink: 0;
1291
+ }
1292
+
1293
+ /* 趋势区域 */
1294
+ .trend-section {
1295
+ display: flex;
1296
+ flex-direction: column;
1297
+ gap: 16px;
1298
+ }
1299
+
1300
+ .section-title {
1301
+ font-size: 14px;
1302
+ font-weight: 700;
1303
+ color: var(--text-primary);
1304
+ text-transform: uppercase;
1305
+ letter-spacing: 0.04em;
1306
+ }
1307
+
1308
+ /* CSS 柱状图 */
1309
+ .bar-chart {
1310
+ display: flex;
1311
+ align-items: flex-end;
1312
+ gap: 4px;
1313
+ height: 160px;
1314
+ padding: 0 4px;
1315
+ }
1316
+
1317
+ .bar-chart-hourly {
1318
+ height: 120px;
1319
+ }
1320
+
1321
+ .bar-col {
1322
+ flex: 1;
1323
+ display: flex;
1324
+ flex-direction: column;
1325
+ align-items: center;
1326
+ gap: 4px;
1327
+ height: 100%;
1328
+ position: relative;
1329
+ }
1330
+
1331
+ .bar-tooltip {
1332
+ font-size: 10px;
1333
+ font-family: 'Spline Sans Mono', monospace;
1334
+ color: var(--text-muted);
1335
+ opacity: 0;
1336
+ transition: opacity 0.2s;
1337
+ position: absolute;
1338
+ top: -2px;
1339
+ white-space: nowrap;
1340
+ }
1341
+
1342
+ .bar-col:hover .bar-tooltip {
1343
+ opacity: 1;
1344
+ }
1345
+
1346
+ .bar-track {
1347
+ flex: 1;
1348
+ width: 100%;
1349
+ max-width: 32px;
1350
+ display: flex;
1351
+ flex-direction: column;
1352
+ justify-content: flex-end;
1353
+ border-radius: 3px 3px 0 0;
1354
+ overflow: hidden;
1355
+ }
1356
+
1357
+ .bar-fill {
1358
+ background: var(--primary);
1359
+ border-radius: 3px 3px 0 0;
1360
+ transition: height 0.5s ease;
1361
+ min-height: 2px;
1362
+ }
1363
+
1364
+ .bar-fill-hourly {
1365
+ background: var(--primary);
1366
+ opacity: 0.7;
1367
+ }
1368
+
1369
+ .bar-col:hover .bar-fill {
1370
+ opacity: 1;
1371
+ filter: brightness(1.2);
1372
+ }
1373
+
1374
+ .bar-label {
1375
+ font-size: 10px;
1376
+ color: var(--text-muted);
1377
+ font-family: 'Spline Sans Mono', monospace;
1378
+ white-space: nowrap;
1379
+ }
1380
+
1381
+ /* 最近记录 */
1382
+ .recent-records {
1383
+ display: flex;
1384
+ flex-direction: column;
1385
+ }
1386
+
1387
+ .record-row {
1388
+ display: flex;
1389
+ justify-content: space-between;
1390
+ align-items: center;
1391
+ padding: 10px 0;
1392
+ border-bottom: 1px solid var(--border-color);
1393
+ }
1394
+
1395
+ .record-row:last-child {
1396
+ border-bottom: none;
1397
+ }
1398
+
1399
+ .record-main {
1400
+ display: flex;
1401
+ align-items: center;
1402
+ gap: 10px;
1403
+ }
1404
+
1405
+ .record-model {
1406
+ font-size: 14px;
1407
+ font-weight: 600;
1408
+ color: var(--text-primary);
1409
+ }
1410
+
1411
+ .record-type {
1412
+ font-size: 12px;
1413
+ color: var(--text-muted);
1414
+ padding: 2px 8px;
1415
+ background: var(--btn-ghost-bg);
1416
+ border-radius: var(--radius-pill);
1417
+ }
1418
+
1419
+ .record-meta {
1420
+ display: flex;
1421
+ align-items: center;
1422
+ gap: 12px;
1423
+ }
1424
+
1425
+ .record-credits {
1426
+ font-size: 14px;
1427
+ font-weight: 700;
1428
+ font-family: 'Spline Sans Mono', monospace;
1429
+ color: var(--error);
1430
+ }
1431
+
1432
+ .record-time {
1433
+ font-size: 12px;
1434
+ color: var(--text-muted);
1435
+ font-family: 'Spline Sans Mono', monospace;
1436
+ }
1437
+
1438
+ .credits-error {
1439
+ color: var(--error);
1440
+ text-align: center;
1441
+ margin-top: 12px;
1442
+ font-size: 14px;
1443
+ }
1444
+
1445
+ .info-tip {
1446
+ text-align: center;
1447
+ padding: 20px;
1448
+ color: var(--text-secondary);
1449
+ background: var(--btn-ghost-bg);
1450
+ border-radius: var(--radius);
1451
+ font-size: 14px;
1452
+ }
1453
+
1454
+ @media (max-width: 768px) {
1455
+ .summary-cards {
1456
+ grid-template-columns: 1fr;
1457
+ }
1458
+
1459
+ .type-label {
1460
+ width: 80px;
1461
+ font-size: 12px;
1462
+ }
1463
+
1464
+ .bar-chart {
1465
+ height: 120px;
1466
+ }
1467
+
1468
+ .bar-chart-hourly {
1469
+ height: 80px;
1470
+ }
1471
+
1472
+ .bar-label {
1473
+ font-size: 8px;
1474
+ }
1475
+ }
1476
+
1477
+ .loading, .empty {
1478
+ text-align: center;
1479
+ padding: 40px;
1480
+ color: var(--text-muted);
1481
+ }
1482
+
1483
+ .packages-list, .orders-list {
1484
+ display: flex;
1485
+ flex-direction: column;
1486
+ gap: 10px;
1487
+ }
1488
+
1489
+ .package-item, .order-item {
1490
+ display: flex;
1491
+ justify-content: space-between;
1492
+ align-items: center;
1493
+ padding: 14px 18px;
1494
+ background: var(--btn-ghost-bg);
1495
+ border-radius: var(--radius);
1496
+ border: 1px solid var(--border-color);
1497
+ transition: background 0.2s;
1498
+ }
1499
+
1500
+ .package-item:hover, .order-item:hover {
1501
+ background: var(--border-color);
1502
+ }
1503
+
1504
+ .order-info {
1505
+ display: flex;
1506
+ flex-direction: column;
1507
+ gap: 4px;
1508
+ }
1509
+
1510
+ .order-name, .package-name {
1511
+ font-weight: 600;
1512
+ color: var(--text-primary);
1513
+ font-size: 15px;
1514
+ }
1515
+
1516
+ .order-time {
1517
+ font-size: 13px;
1518
+ color: var(--text-muted);
1519
+ font-family: 'Spline Sans Mono', monospace;
1520
+ }
1521
+
1522
+ .package-credits {
1523
+ font-family: 'Spline Sans Mono', monospace;
1524
+ font-weight: 600;
1525
+ color: var(--primary);
1526
+ }
1527
+
1528
+ .order-status {
1529
+ font-size: 13px;
1530
+ font-weight: 600;
1531
+ }
1532
+ </style>