@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,1524 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Kite 控制台</title>
7
+ <link rel="icon" href="data:,">
8
+ <link rel="stylesheet" href="css/style.css?v=7">
9
+ <script>
10
+ // 在 DOM 加载前判断 token,避免闪烁
11
+ (function() {
12
+ function getCookie(name) {
13
+ const value = `; ${document.cookie}`;
14
+ const parts = value.split(`; ${name}=`);
15
+ if (parts.length === 2) return parts.pop().split(';').shift();
16
+ return null;
17
+ }
18
+
19
+ const hasToken = localStorage.getItem('kiteToken') || getCookie('kiteToken');
20
+ if (hasToken) {
21
+ // 有 token,默认显示主页面
22
+ document.documentElement.classList.add('has-token');
23
+ }
24
+ })();
25
+ </script>
26
+ <style>
27
+ /* 页面显示控制 */
28
+ html.has-token #login-page { display: none !important; }
29
+ html.has-token #main-app { display: block !important; }
30
+ html:not(.has-token) #login-page { display: flex !important; }
31
+ html:not(.has-token) #main-app { display: none !important; }
32
+
33
+ /* 登录页面样式方案切换 - 在 body 添加 data-login-theme 属性 */
34
+ /* 方案 1: 极简商务风 - theme-minimal */
35
+ /* 方案 2: 现代扁平风 - theme-flat */
36
+ /* 方案 3: 传统表单风 - theme-classic */
37
+
38
+ /* === 方案 1: 极简商务风 === */
39
+ body[data-login-theme="theme-minimal"] #login-page .login-container {
40
+ display: flex;
41
+ justify-content: center;
42
+ align-items: center;
43
+ min-height: 100vh;
44
+ background: #f5f5f5;
45
+ }
46
+ body[data-login-theme="theme-minimal"] #login-page .login-box {
47
+ background: white;
48
+ padding: 48px 40px;
49
+ border-radius: 2px;
50
+ box-shadow: 0 2px 8px rgba(0,0,0,0.08);
51
+ width: 100%;
52
+ max-width: 360px;
53
+ border-top: 3px solid #333;
54
+ }
55
+ body[data-login-theme="theme-minimal"] #login-page .login-title {
56
+ font-size: 24px;
57
+ font-weight: 400;
58
+ margin-bottom: 32px;
59
+ color: #333;
60
+ letter-spacing: 0.5px;
61
+ }
62
+ body[data-login-theme="theme-minimal"] #login-page .form-label {
63
+ display: block;
64
+ margin-bottom: 8px;
65
+ font-weight: 400;
66
+ color: #666;
67
+ font-size: 13px;
68
+ }
69
+ body[data-login-theme="theme-minimal"] #login-page .form-input {
70
+ width: 100%;
71
+ padding: 10px 12px;
72
+ border: 1px solid #ddd;
73
+ border-radius: 2px;
74
+ font-size: 14px;
75
+ box-sizing: border-box;
76
+ transition: border-color 0.2s;
77
+ }
78
+ body[data-login-theme="theme-minimal"] #login-page .form-input:focus {
79
+ outline: none;
80
+ border-color: #333;
81
+ }
82
+ body[data-login-theme="theme-minimal"] #login-page .btn-primary {
83
+ width: 100%;
84
+ padding: 11px;
85
+ background: #333;
86
+ color: white;
87
+ border: none;
88
+ border-radius: 2px;
89
+ font-size: 14px;
90
+ font-weight: 400;
91
+ cursor: pointer;
92
+ transition: background 0.2s;
93
+ }
94
+ body[data-login-theme="theme-minimal"] #login-page .btn-primary:hover {
95
+ background: #000;
96
+ }
97
+ body[data-login-theme="theme-minimal"] #login-page .btn-primary:disabled {
98
+ background: #ccc;
99
+ cursor: not-allowed;
100
+ }
101
+
102
+ /* === 方案 2: 现代扁平风 === */
103
+ body[data-login-theme="theme-flat"] #login-page .login-container {
104
+ display: flex;
105
+ justify-content: center;
106
+ align-items: center;
107
+ min-height: 100vh;
108
+ background: #fafafa;
109
+ }
110
+ body[data-login-theme="theme-flat"] #login-page .login-box {
111
+ background: white;
112
+ padding: 40px;
113
+ border-radius: 8px;
114
+ box-shadow: 0 1px 3px rgba(0,0,0,0.06);
115
+ width: 100%;
116
+ max-width: 380px;
117
+ border: 1px solid #e8e8e8;
118
+ }
119
+ body[data-login-theme="theme-flat"] #login-page .login-title {
120
+ font-size: 22px;
121
+ font-weight: 500;
122
+ margin-bottom: 28px;
123
+ color: #1a1a1a;
124
+ }
125
+ body[data-login-theme="theme-flat"] #login-page .form-label {
126
+ display: block;
127
+ margin-bottom: 6px;
128
+ font-weight: 500;
129
+ color: #4a4a4a;
130
+ font-size: 13px;
131
+ }
132
+ body[data-login-theme="theme-flat"] #login-page .form-input {
133
+ width: 100%;
134
+ padding: 11px 14px;
135
+ border: 1px solid #e0e0e0;
136
+ border-radius: 4px;
137
+ font-size: 14px;
138
+ box-sizing: border-box;
139
+ background: #fafafa;
140
+ transition: all 0.2s;
141
+ }
142
+ body[data-login-theme="theme-flat"] #login-page .form-input:focus {
143
+ outline: none;
144
+ border-color: #4a90e2;
145
+ background: white;
146
+ }
147
+ body[data-login-theme="theme-flat"] #login-page .btn-primary {
148
+ width: 100%;
149
+ padding: 12px;
150
+ background: #4a90e2;
151
+ color: white;
152
+ border: none;
153
+ border-radius: 4px;
154
+ font-size: 14px;
155
+ font-weight: 500;
156
+ cursor: pointer;
157
+ transition: background 0.2s;
158
+ }
159
+ body[data-login-theme="theme-flat"] #login-page .btn-primary:hover {
160
+ background: #357abd;
161
+ }
162
+ body[data-login-theme="theme-flat"] #login-page .btn-primary:disabled {
163
+ background: #d0d0d0;
164
+ cursor: not-allowed;
165
+ }
166
+
167
+ /* === 方案 3: 传统表单风 === */
168
+ body[data-login-theme="theme-classic"] #login-page .login-container {
169
+ display: flex;
170
+ justify-content: center;
171
+ align-items: center;
172
+ min-height: 100vh;
173
+ background: #e9ecef;
174
+ }
175
+ body[data-login-theme="theme-classic"] #login-page .login-box {
176
+ background: white;
177
+ padding: 36px 32px;
178
+ border-radius: 4px;
179
+ box-shadow: 0 0 10px rgba(0,0,0,0.1);
180
+ width: 100%;
181
+ max-width: 400px;
182
+ }
183
+ body[data-login-theme="theme-classic"] #login-page .login-title {
184
+ font-size: 20px;
185
+ font-weight: 600;
186
+ margin-bottom: 24px;
187
+ color: #212529;
188
+ text-align: center;
189
+ border-bottom: 2px solid #dee2e6;
190
+ padding-bottom: 12px;
191
+ }
192
+ body[data-login-theme="theme-classic"] #login-page .form-label {
193
+ display: block;
194
+ margin-bottom: 6px;
195
+ font-weight: 600;
196
+ color: #495057;
197
+ font-size: 13px;
198
+ }
199
+ body[data-login-theme="theme-classic"] #login-page .form-input {
200
+ width: 100%;
201
+ padding: 10px 12px;
202
+ border: 1px solid #ced4da;
203
+ border-radius: 3px;
204
+ font-size: 14px;
205
+ box-sizing: border-box;
206
+ transition: border-color 0.15s;
207
+ }
208
+ body[data-login-theme="theme-classic"] #login-page .form-input:focus {
209
+ outline: none;
210
+ border-color: #80bdff;
211
+ box-shadow: 0 0 0 0.2rem rgba(0,123,255,.25);
212
+ }
213
+ body[data-login-theme="theme-classic"] #login-page .btn-primary {
214
+ width: 100%;
215
+ padding: 10px;
216
+ background: #007bff;
217
+ color: white;
218
+ border: none;
219
+ border-radius: 3px;
220
+ font-size: 14px;
221
+ font-weight: 600;
222
+ cursor: pointer;
223
+ transition: background 0.15s;
224
+ }
225
+ body[data-login-theme="theme-classic"] #login-page .btn-primary:hover {
226
+ background: #0056b3;
227
+ }
228
+ body[data-login-theme="theme-classic"] #login-page .btn-primary:disabled {
229
+ background: #6c757d;
230
+ cursor: not-allowed;
231
+ }
232
+
233
+ /* 通用样式 */
234
+ .form-group {
235
+ margin-bottom: 20px;
236
+ }
237
+ .error-msg {
238
+ color: #e74c3c;
239
+ font-size: 14px;
240
+ margin-top: 10px;
241
+ text-align: center;
242
+ }
243
+ .success-msg {
244
+ color: #27ae60;
245
+ font-size: 14px;
246
+ margin-top: 10px;
247
+ text-align: center;
248
+ }
249
+ .hidden {
250
+ display: none !important;
251
+ }
252
+
253
+ /* 标签页样式 */
254
+ .tabs {
255
+ display: flex;
256
+ gap: 2px;
257
+ margin-bottom: 20px;
258
+ border-bottom: 2px solid #e0e0e0;
259
+ }
260
+ .tab {
261
+ padding: 10px 20px;
262
+ background: transparent;
263
+ border: none;
264
+ border-bottom: 2px solid transparent;
265
+ margin-bottom: -2px;
266
+ cursor: pointer;
267
+ font-size: 14px;
268
+ color: #666;
269
+ transition: all 0.2s;
270
+ }
271
+ .tab:hover {
272
+ color: #333;
273
+ background: #f5f5f5;
274
+ }
275
+ .tab.active {
276
+ color: #007bff;
277
+ border-bottom-color: #007bff;
278
+ font-weight: 600;
279
+ }
280
+ .tab-content {
281
+ display: none;
282
+ }
283
+ .tab-content.active {
284
+ display: block;
285
+ }
286
+
287
+
288
+ /* 默认使用方案 1 */
289
+ body:not([data-login-theme]) {
290
+ --login-theme: theme-minimal;
291
+ }
292
+ body:not([data-login-theme]) #login-page .login-container {
293
+ display: flex;
294
+ justify-content: center;
295
+ align-items: center;
296
+ min-height: 100vh;
297
+ background: #f5f5f5;
298
+ }
299
+ body:not([data-login-theme]) #login-page .login-box {
300
+ background: white;
301
+ padding: 48px 40px;
302
+ border-radius: 2px;
303
+ box-shadow: 0 2px 8px rgba(0,0,0,0.08);
304
+ width: 100%;
305
+ max-width: 360px;
306
+ border-top: 3px solid #333;
307
+ }
308
+ body:not([data-login-theme]) #login-page .login-title {
309
+ font-size: 24px;
310
+ font-weight: 400;
311
+ margin-bottom: 32px;
312
+ color: #333;
313
+ letter-spacing: 0.5px;
314
+ }
315
+ body:not([data-login-theme]) #login-page .form-label {
316
+ display: block;
317
+ margin-bottom: 8px;
318
+ font-weight: 400;
319
+ color: #666;
320
+ font-size: 13px;
321
+ }
322
+ body:not([data-login-theme]) #login-page .form-input {
323
+ width: 100%;
324
+ padding: 10px 12px;
325
+ border: 1px solid #ddd;
326
+ border-radius: 2px;
327
+ font-size: 14px;
328
+ box-sizing: border-box;
329
+ transition: border-color 0.2s;
330
+ }
331
+ body:not([data-login-theme]) #login-page .form-input:focus {
332
+ outline: none;
333
+ border-color: #333;
334
+ }
335
+ body:not([data-login-theme]) #login-page .btn-primary {
336
+ width: 100%;
337
+ padding: 11px;
338
+ background: #333;
339
+ color: white;
340
+ border: none;
341
+ border-radius: 2px;
342
+ font-size: 14px;
343
+ font-weight: 400;
344
+ cursor: pointer;
345
+ transition: background 0.2s;
346
+ }
347
+ body:not([data-login-theme]) #login-page .btn-primary:hover {
348
+ background: #000;
349
+ }
350
+ body:not([data-login-theme]) #login-page .btn-primary:disabled {
351
+ background: #ccc;
352
+ cursor: not-allowed;
353
+ }
354
+ </style>
355
+ </head>
356
+ <body>
357
+ <!--
358
+ 登录页面样式方案切换:
359
+ 方案 1(默认): 极简商务风 - 不设置或 data-login-theme="theme-minimal"
360
+ 方案 2: 现代扁平风 - data-login-theme="theme-flat"
361
+ 方案 3: 传统表单风 - data-login-theme="theme-classic"
362
+
363
+ 切换方法:在 <body> 标签添加 data-login-theme 属性
364
+ 例如:<body data-login-theme="theme-flat">
365
+ -->
366
+
367
+ <!-- Login Page -->
368
+ <div id="login-page" class="login-container">
369
+ <!-- 样式切换按钮 -->
370
+ <div style="position:absolute;top:20px;right:20px;display:flex;gap:8px;z-index:10;">
371
+ <button onclick="document.body.removeAttribute('data-login-theme')" style="padding:8px 16px;border:1px solid #ddd;background:white;border-radius:4px;cursor:pointer;font-size:13px;transition:all 0.2s;" onmouseover="this.style.background='#f5f5f5'" onmouseout="this.style.background='white'">极简商务</button>
372
+ <button onclick="document.body.setAttribute('data-login-theme','theme-flat')" style="padding:8px 16px;border:1px solid #ddd;background:white;border-radius:4px;cursor:pointer;font-size:13px;transition:all 0.2s;" onmouseover="this.style.background='#f5f5f5'" onmouseout="this.style.background='white'">现代扁平</button>
373
+ <button onclick="document.body.setAttribute('data-login-theme','theme-classic')" style="padding:8px 16px;border:1px solid #ddd;background:white;border-radius:4px;cursor:pointer;font-size:13px;transition:all 0.2s;" onmouseover="this.style.background='#f5f5f5'" onmouseout="this.style.background='white'">传统表单</button>
374
+ </div>
375
+
376
+ <div class="login-box">
377
+ <h1 class="login-title">Kite 控制台登录</h1>
378
+ <div class="form-group">
379
+ <label class="form-label">手机号</label>
380
+ <input type="tel" id="login-phone" class="form-input" placeholder="请输入手机号" maxlength="11">
381
+ </div>
382
+ <div class="form-group">
383
+ <label class="form-label">验证码</label>
384
+ <div style="display: flex; gap: 10px;">
385
+ <input type="text" id="login-code" class="form-input" placeholder="请输入验证码" maxlength="6" style="flex: 1;" onkeypress="if(event.key==='Enter' && this.value.length===6) document.getElementById('btn-login').click()">
386
+ <button id="btn-send-code" class="btn-primary" style="width: auto; padding: 12px 20px;">发送验证码</button>
387
+ </div>
388
+ </div>
389
+ <button id="btn-login" class="btn-primary">登录</button>
390
+ <div id="login-message"></div>
391
+ </div>
392
+ </div>
393
+
394
+ <!-- Main App -->
395
+ <div id="main-app">
396
+ <header id="app-header">
397
+ <div class="header-left">
398
+ <button id="sidebar-toggle" class="icon-btn">&#9776;</button>
399
+ <h1 class="header-title">Kite 控制台</h1>
400
+ <span id="system-info" style="margin-left:12px;font-size:12px;color:#999;font-weight:normal;"></span>
401
+ </div>
402
+ <div class="header-right">
403
+ <!-- WebSocket 连接状态 + 重连次数 + 流量统计 -->
404
+ <div id="ws-status-container" style="display:flex;align-items:center;gap:12px;margin-right:16px;font-size:13px;">
405
+ <!-- 流量统计(最左侧,固定宽度) -->
406
+ <span id="ws-traffic"
407
+ style="color:#999;cursor:default;position:relative;display:inline-block;min-width:110px;text-align:left;font-family:monospace;font-size:12px;">
408
+ ↑0 B/s ↓0 B/s
409
+ </span>
410
+ <!-- 最后消息时间 -->
411
+ <span id="ws-last-msg-time" style="color:#999;font-size:12px;font-family:monospace;display:none;"></span>
412
+ <!-- 重连次数 -->
413
+ <span id="ws-reconnect-count" style="color:#999;display:none;min-width:55px;">重连: 0</span>
414
+ <!-- 连接状态(最右侧) -->
415
+ <span id="ws-indicator" style="color:#999;">○ 未连接</span>
416
+ </div>
417
+
418
+ <!-- 流量统计 Tooltip -->
419
+ <div id="traffic-tooltip" style="display:none;position:fixed;background:rgba(255,255,255,0.98);color:#333;border:1px solid #ddd;border-radius:8px;padding:14px;z-index:10000;pointer-events:none;font-size:13px;line-height:1.8;width:240px;box-shadow:0 4px 16px rgba(0,0,0,0.15);">
420
+ <div style="display:flex;justify-content:space-between;margin-bottom:8px;padding-bottom:8px;border-bottom:1px solid #eee;">
421
+ <span style="color:#666;font-weight:500;">总接收</span>
422
+ <span id="tooltip-rx-total" style="color:#27ae60;font-weight:600;font-family:monospace;min-width:70px;text-align:right;">0 B</span>
423
+ </div>
424
+ <div style="display:flex;justify-content:space-between;margin-bottom:8px;padding-bottom:8px;border-bottom:1px solid #eee;">
425
+ <span style="color:#666;font-weight:500;">总发送</span>
426
+ <span id="tooltip-tx-total" style="color:#3498db;font-weight:600;font-family:monospace;min-width:70px;text-align:right;">0 B</span>
427
+ </div>
428
+ <div style="display:flex;justify-content:space-between;margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid #eee;">
429
+ <span style="color:#666;font-weight:500;">实时速率</span>
430
+ <span id="tooltip-rate" style="color:#e67e22;font-weight:600;font-family:monospace;min-width:70px;text-align:right;">0 B/s</span>
431
+ </div>
432
+ <div style="height:100px;background:#f8f9fa;border-radius:4px;padding:8px;">
433
+ <canvas id="tooltip-chart" width="208" height="84"></canvas>
434
+ </div>
435
+ </div>
436
+
437
+ <!-- 未登录状态 -->
438
+ <a id="login-btn" href="javascript:void(0)" class="hidden" style="color:#667eea;text-decoration:none;font-size:14px;">登录</a>
439
+
440
+ <!-- 已登录状态 -->
441
+ <div id="user-info-area" class="hidden" style="align-items:center;gap:12px;font-size:14px;">
442
+ <span class="user-name" style="color:#333;font-weight:500;"></span>
443
+ <span class="user-credits" style="color:#666;font-size:13px;"></span>
444
+ <span style="color:#ddd;">|</span>
445
+ <a id="btn-logout" href="javascript:void(0)" style="color:#999;text-decoration:none;" onmouseover="this.style.color='#667eea'" onmouseout="this.style.color='#999'">退出</a>
446
+ </div>
447
+ </div>
448
+ </header>
449
+
450
+ <div id="app-layout">
451
+ <nav id="sidebar">
452
+ <ul class="nav-list">
453
+ <li class="nav-item active" data-page="account">
454
+ <span class="nav-label">账户信息</span>
455
+ <span class="nav-sublabel">Account</span>
456
+ </li>
457
+ <li class="nav-item" data-page="credits">
458
+ <span class="nav-label">积分统计</span>
459
+ <span class="nav-sublabel">Credits</span>
460
+ </li>
461
+ <li class="nav-item" data-page="modules">
462
+ <span class="nav-label">模块管理</span>
463
+ <span class="nav-sublabel">Modules</span>
464
+ </li>
465
+ <li class="nav-item" data-page="tokens">
466
+ <span class="nav-label">Token管理</span>
467
+ <span class="nav-sublabel">Tokens</span>
468
+ </li>
469
+ <li class="nav-item" data-page="llm-test">
470
+ <span class="nav-label">模型测试</span>
471
+ <span class="nav-sublabel">LLM Test</span>
472
+ </li>
473
+ <li class="nav-divider"></li>
474
+ <li class="nav-item" data-page="registry">
475
+ <span class="nav-label">注册中心</span>
476
+ <span class="nav-sublabel">Registry</span>
477
+ </li>
478
+ <li class="nav-item" data-page="events">
479
+ <span class="nav-label">事件中心</span>
480
+ <span class="nav-sublabel">Events</span>
481
+ </li>
482
+ <li class="nav-item" data-page="logs">
483
+ <span class="nav-label">日志</span>
484
+ <span class="nav-sublabel">Logs</span>
485
+ </li>
486
+ <li class="nav-item" data-page="terminal">
487
+ <span class="nav-label">终端</span>
488
+ <span class="nav-sublabel">Terminal</span>
489
+ </li>
490
+ <li class="nav-item" data-page="tests">
491
+ <span class="nav-label">测试中心</span>
492
+ <span class="nav-sublabel">Tests</span>
493
+ </li>
494
+ <li class="nav-item" data-page="audit">
495
+ <span class="nav-label">审计</span>
496
+ <span class="nav-sublabel">Audit</span>
497
+ </li>
498
+ <li class="nav-item" data-page="health">
499
+ <span class="nav-label">健康检查</span>
500
+ <span class="nav-sublabel">Health</span>
501
+ </li>
502
+ <li class="nav-item" data-page="api-ref">
503
+ <span class="nav-label">接口大全</span>
504
+ <span class="nav-sublabel">API Reference</span>
505
+ </li>
506
+ </ul>
507
+ </nav>
508
+
509
+ <main id="main-content">
510
+ <!-- Account Info -->
511
+ <section id="page-account" class="page active">
512
+ <h2 class="page-title">账户信息</h2>
513
+ <div class="panel">
514
+ <div id="account-info">加载中...</div>
515
+ </div>
516
+ </section>
517
+
518
+ <!-- Credits Stats -->
519
+ <section id="page-credits" class="page">
520
+ <h2 class="page-title">积分统计</h2>
521
+ <div class="panel">
522
+ <div id="credits-stats">加载中...</div>
523
+ </div>
524
+ </section>
525
+
526
+ <!-- Modules Management -->
527
+ <section id="page-modules" class="page">
528
+ <div id="modules-list-header" style="display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;">
529
+ <div style="display:flex;align-items:center;gap:12px;">
530
+ <h2 class="page-title" style="margin-bottom:0;">模块管理</h2>
531
+ <span id="module-save-status" class="config-save-status"></span>
532
+ </div>
533
+ <div style="display:flex;align-items:center;gap:16px;">
534
+ <button class="btn btn-sm btn-secondary" id="btn-toggle-console">
535
+ <span id="console-toggle-text">展开控制台</span>
536
+ </button>
537
+ <button class="btn btn-warning" id="btn-restart-kite" style="display:flex;align-items:center;gap:6px;">
538
+ <span>重启 Kite</span>
539
+ </button>
540
+ </div>
541
+ </div>
542
+
543
+ <!-- Real-time Console (collapsible) -->
544
+ <div id="realtime-console" class="panel" style="display:none;margin-bottom:20px;">
545
+ <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;">
546
+ <h3 style="margin:0;font-size:14px;font-weight:600;">实时事件日志</h3>
547
+ </div>
548
+
549
+ <!-- 筛选器 -->
550
+ <div style="display:grid;grid-template-columns:1fr 1fr 1fr 1fr 1fr;gap:10px;margin-bottom:10px;padding:12px;background:#f5f5f5;border-radius:4px;">
551
+ <div>
552
+ <label style="display:block;margin-bottom:4px;font-size:12px;color:#666;">事件分类</label>
553
+ <select id="filter-category" style="width:100%;padding:6px;border:1px solid #ddd;border-radius:3px;font-size:12px;">
554
+ <option value="">全部</option>
555
+ <option value="rpc">RPC 调用</option>
556
+ <option value="event">事件</option>
557
+ </select>
558
+ </div>
559
+ <div>
560
+ <label style="display:block;margin-bottom:4px;font-size:12px;color:#666;">模块</label>
561
+ <select id="filter-module" style="width:100%;padding:6px;border:1px solid #ddd;border-radius:3px;font-size:12px;">
562
+ <option value="">全部模块</option>
563
+ </select>
564
+ </div>
565
+ <div>
566
+ <label style="display:block;margin-bottom:4px;font-size:12px;color:#666;">事件类型</label>
567
+ <select id="filter-event" style="width:100%;padding:6px;border:1px solid #ddd;border-radius:3px;font-size:12px;">
568
+ <option value="">全部事件</option>
569
+ </select>
570
+ </div>
571
+ <div>
572
+ <label style="display:block;margin-bottom:4px;font-size:12px;color:#666;">关键词 (glob)</label>
573
+ <input type="text" id="filter-keyword" placeholder="例: *error*" style="width:100%;padding:6px;border:1px solid #ddd;border-radius:3px;font-size:12px;">
574
+ </div>
575
+ <div>
576
+ <label style="display:block;margin-bottom:4px;font-size:12px;color:#666;">时间范围</label>
577
+ <select id="filter-time" style="width:100%;padding:6px;border:1px solid #ddd;border-radius:3px;font-size:12px;">
578
+ <option value="0">全部时间</option>
579
+ <option value="300">最近5分钟</option>
580
+ <option value="1800">最近30分钟</option>
581
+ <option value="3600">最近1小时</option>
582
+ <option value="21600">最近6小时</option>
583
+ <option value="86400" selected>最近24小时</option>
584
+ </select>
585
+ </div>
586
+ </div>
587
+
588
+ <!-- 虚拟列表容器 -->
589
+ <div id="event-list-container" style="background:#1e1e1e;border-radius:4px;height:500px;overflow-y:auto;position:relative;">
590
+ <!-- 虚拟列表内容 -->
591
+ <div id="event-list-content" style="position:relative;"></div>
592
+ <!-- 空状态提示 -->
593
+ <div id="event-list-empty" style="display:none;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#858585;text-align:center;">
594
+ <div style="font-size:48px;margin-bottom:12px;">📭</div>
595
+ <div style="font-size:14px;">暂无事件日志</div>
596
+ </div>
597
+ </div>
598
+
599
+ <!-- 控制栏 -->
600
+ <div style="display:flex;align-items:center;justify-content:space-between;margin-top:8px;">
601
+ <div style="display:flex;align-items:center;gap:12px;">
602
+ <label style="display:flex;align-items:center;gap:6px;font-size:13px;cursor:pointer;">
603
+ <input type="checkbox" id="pause-updates" style="cursor:pointer;">
604
+ <span>停止接收</span>
605
+ </label>
606
+ <button class="btn btn-sm btn-secondary" id="btn-scroll-top">↑ 顶部</button>
607
+ <button class="btn btn-sm btn-secondary" id="btn-scroll-bottom">↓ 底部</button>
608
+ <button class="btn btn-sm btn-secondary" id="btn-clear-console">清空</button>
609
+ </div>
610
+ <div style="font-size:12px;color:#999;" id="event-count-label">共 0 条</div>
611
+ </div>
612
+ </div>
613
+
614
+ <!-- Statistics Panel -->
615
+ <div class="panel" style="margin-bottom:20px;" id="statistics-panel">
616
+ <div class="stats-grid">
617
+ <div class="stat-item" data-stat-type="uptime">
618
+ <div class="stat-label">运行时长</div>
619
+ <div class="stat-value" id="stat-uptime">--</div>
620
+ </div>
621
+ <div class="stat-item" data-stat-type="modules">
622
+ <div class="stat-label">模块数量</div>
623
+ <div class="stat-value" id="stat-modules">--</div>
624
+ </div>
625
+ <div class="stat-item" data-stat-type="registry">
626
+ <div class="stat-label">注册记录</div>
627
+ <div class="stat-value" id="stat-registry">--</div>
628
+ </div>
629
+ <div class="stat-item" data-stat-type="rpc">
630
+ <div class="stat-label">RPC 方法</div>
631
+ <div class="stat-value" id="stat-rpc">--</div>
632
+ </div>
633
+ <div class="stat-item" data-stat-type="hooks">
634
+ <div class="stat-label">Hook 数量</div>
635
+ <div class="stat-value" id="stat-hooks">--</div>
636
+ </div>
637
+ <div class="stat-item" data-stat-type="api">
638
+ <div class="stat-label">API 端点</div>
639
+ <div class="stat-value" id="stat-api">--</div>
640
+ </div>
641
+ <div class="stat-item" data-stat-type="events">
642
+ <div class="stat-label">事件处理</div>
643
+ <div class="stat-value" id="stat-events">--</div>
644
+ </div>
645
+ <div class="stat-item" data-stat-type="rpc-calls">
646
+ <div class="stat-label">RPC 调用</div>
647
+ <div class="stat-value" id="stat-rpc-calls">--</div>
648
+ </div>
649
+ </div>
650
+ <!-- 状态提示区 -->
651
+ <div id="stats-status" class="stats-status" style="margin-top:12px;padding:8px 12px;border-radius:4px;font-size:13px;line-height:1.5;"></div>
652
+ </div>
653
+
654
+ <!-- Tooltip for statistics -->
655
+ <div id="stat-tooltip" class="stat-tooltip"></div>
656
+
657
+ <!-- Module List Tabs -->
658
+ <div style="display:flex;gap:8px;margin-bottom:0;border-bottom:1px solid #333;">
659
+ <button class="test-tab active" id="tab-local-modules" data-module-tab="local">本地模块</button>
660
+ <button class="test-tab" id="tab-remote-modules" data-module-tab="remote">远程模块</button>
661
+ </div>
662
+
663
+ <!-- Local Module List Table -->
664
+ <div class="panel" id="local-modules-panel">
665
+ <div class="table-wrapper">
666
+ <table class="data-table" id="modules-table">
667
+ <thead>
668
+ <tr>
669
+ <th style="width:40px;"></th>
670
+ <th style="width:120px;">模块</th>
671
+ <th>类型</th>
672
+ <th>版本</th>
673
+ <th>端口</th>
674
+ <th>连接数</th>
675
+ <th>实例数</th>
676
+ <th>进程ID</th>
677
+ <th>启动耗时</th>
678
+ <th>运行时长</th>
679
+ <th>启动次数</th>
680
+ <th>Ping</th>
681
+ <th>运行状态</th>
682
+ <th>默认状态</th>
683
+ <th style="width:100px;">操作</th>
684
+ </tr>
685
+ </thead>
686
+ <tbody id="modules-tbody">
687
+ <tr><td colspan="15" class="text-muted" style="text-align:center;padding:40px;">加载中...</td></tr>
688
+ </tbody>
689
+ </table>
690
+ </div>
691
+ </div>
692
+
693
+ <!-- Remote Module List Table -->
694
+ <div class="panel" id="remote-modules-panel" style="display:none;">
695
+ <div class="table-wrapper">
696
+ <table class="data-table" id="remote-modules-table">
697
+ <thead>
698
+ <tr>
699
+ <th style="width:40px;"></th>
700
+ <th>模块 ID</th>
701
+ <th>来源 Relay</th>
702
+ <th>注册状态</th>
703
+ <th>注册时间</th>
704
+ <th>在线时长</th>
705
+ <th style="width:80px;">操作</th>
706
+ </tr>
707
+ </thead>
708
+ <tbody id="remote-modules-tbody">
709
+ <tr><td colspan="7" class="text-muted" style="text-align:center;padding:40px;">点击「远程模块」标签加载</td></tr>
710
+ </tbody>
711
+ </table>
712
+ </div>
713
+ </div>
714
+
715
+ <!-- Module Detail Panel (hidden by default) -->
716
+ <div id="module-detail" class="hidden">
717
+ <!-- 头部 -->
718
+ <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;width:100%;">
719
+ <!-- 左侧:返回 + 标题 -->
720
+ <div style="display:flex;align-items:center;">
721
+ <button id="btn-module-back" style="background:none;border:none;cursor:pointer;padding:4px 0;font-size:14px;color:var(--primary);">&lt; 返回</button>
722
+ <h3 id="module-detail-name" style="font-size:18px;font-weight:600;color:#333;margin:0 0 0 20px;"></h3>
723
+ </div>
724
+ <!-- 右侧:运行状态 + 操作按钮 -->
725
+ <div style="display:flex;align-items:center;gap:12px;">
726
+ <div style="display:flex;align-items:center;gap:6px;">
727
+ <span id="module-detail-status-dot" class="module-state-dot" style="width:8px;height:8px;border-radius:50%;display:inline-block;"></span>
728
+ <span id="module-detail-run-status" style="font-size:13px;"></span>
729
+ </div>
730
+ <button class="btn btn-sm" id="btn-detail-action" style="min-width:82px;"></button>
731
+ <button class="btn btn-sm btn-secondary" id="btn-reset-defaults">恢复默认值</button>
732
+ </div>
733
+ </div>
734
+
735
+ <!-- 【区块1:模块标识】 -->
736
+ <div class="form-section" style="background:#f9f9f9;padding:16px;border-radius:6px;margin-bottom:16px;">
737
+ <h4 style="margin:0 0 12px 0;font-size:14px;font-weight:600;color:#666;">模块标识</h4>
738
+
739
+ <!-- 模块路径 -->
740
+ <div style="margin-bottom:12px;display:flex;align-items:center;">
741
+ <label style="width:140px;font-size:13px;color:#666;flex-shrink:0;">模块路径 <span style="font-size:11px;color:#999;">(source_path)</span></label>
742
+ <input type="text" id="mod-source-path" disabled style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;background:#e9ecef;cursor:not-allowed;font-size:12px;font-family:monospace;">
743
+ </div>
744
+
745
+ <div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px;">
746
+ <div style="display:flex;align-items:center;">
747
+ <label style="width:140px;font-size:13px;color:#666;flex-shrink:0;">模块名 <span style="font-size:11px;color:#999;">(name)</span></label>
748
+ <input type="text" id="mod-meta-name" disabled style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;background:#e9ecef;cursor:not-allowed;">
749
+ </div>
750
+ <div style="display:flex;align-items:center;">
751
+ <label style="width:140px;font-size:13px;color:#666;flex-shrink:0;">模块类型 <span style="font-size:11px;color:#999;">(type)</span></label>
752
+ <input type="text" id="mod-meta-type" disabled style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;background:#e9ecef;cursor:not-allowed;">
753
+ </div>
754
+ </div>
755
+
756
+ <div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px;">
757
+ <div style="display:flex;align-items:center;">
758
+ <label style="width:140px;font-size:13px;color:#666;flex-shrink:0;">运行时 <span style="font-size:11px;color:#999;">(runtime)</span></label>
759
+ <input type="text" id="mod-meta-runtime" disabled style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;background:#e9ecef;cursor:not-allowed;">
760
+ </div>
761
+ <div style="display:flex;align-items:center;">
762
+ <label style="width:140px;font-size:13px;color:#666;flex-shrink:0;">入口文件 <span style="font-size:11px;color:#999;">(entry)</span></label>
763
+ <input type="text" id="mod-meta-entry" disabled style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;background:#e9ecef;cursor:not-allowed;">
764
+ </div>
765
+ </div>
766
+
767
+ <div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
768
+ <div style="display:flex;align-items:center;">
769
+ <label style="width:140px;font-size:13px;color:#666;flex-shrink:0;">版本 <span style="font-size:11px;color:#999;">(version)</span></label>
770
+ <input type="text" id="mod-meta-version" disabled style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;background:#e9ecef;cursor:not-allowed;">
771
+ </div>
772
+ <div style="display:flex;align-items:center;">
773
+ <label style="width:140px;font-size:13px;color:#666;flex-shrink:0;">显示名称 <span style="font-size:11px;color:#999;">(display_name)</span></label>
774
+ <input type="text" id="mod-meta-display-name" data-field="display_name" style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;">
775
+ </div>
776
+ </div>
777
+ </div>
778
+
779
+ <!-- 【区块2:启动配置】 -->
780
+ <div class="form-section" style="background:#f9f9f9;padding:16px;border-radius:6px;margin-bottom:16px;">
781
+ <h4 style="margin:0 0 12px 0;font-size:14px;font-weight:600;color:#666;">启动配置</h4>
782
+
783
+ <div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
784
+ <div style="display:flex;align-items:center;">
785
+ <label style="width:200px;font-size:13px;color:#666;flex-shrink:0;">默认状态 <span style="font-size:11px;color:#999;">(state)</span></label>
786
+ <select id="mod-meta-state" data-field="state" style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;">
787
+ <option value="enabled">enabled - 自动启动</option>
788
+ <option value="manual">manual - 手动启动</option>
789
+ <option value="disabled">disabled - 禁用</option>
790
+ </select>
791
+ </div>
792
+ <div style="display:flex;align-items:center;">
793
+ <label style="width:200px;font-size:13px;color:#666;flex-shrink:0;">监控 <span style="font-size:11px;color:#999;">(monitor)</span></label>
794
+ <select id="mod-meta-monitor" data-field="monitor" style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;">
795
+ <option value="true">启用监控 (默认)</option>
796
+ <option value="false">禁用监控</option>
797
+ </select>
798
+ </div>
799
+ </div>
800
+ </div>
801
+
802
+ <!-- 【区块3:网络配置】 -->
803
+ <div class="form-section" style="background:#f9f9f9;padding:16px;border-radius:6px;margin-bottom:16px;">
804
+ <h4 style="margin:0 0 12px 0;font-size:14px;font-weight:600;color:#666;">网络配置</h4>
805
+
806
+ <div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
807
+ <div style="display:flex;align-items:center;">
808
+ <label style="width:200px;font-size:13px;color:#666;flex-shrink:0;">首选端口 <span style="font-size:11px;color:#999;">(preferred_port)</span></label>
809
+ <input type="number" id="mod-meta-port" data-field="preferred_port" placeholder="(无)" style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;">
810
+ </div>
811
+ <div style="display:flex;align-items:center;">
812
+ <label style="width:200px;font-size:13px;color:#666;flex-shrink:0;">监听地址 <span style="font-size:11px;color:#999;">(advertise_ip)</span></label>
813
+ <select id="mod-meta-ip" data-field="advertise_ip" style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;">
814
+ <option value="127.0.0.1">127.0.0.1 - 仅本地</option>
815
+ <option value="0.0.0.0">0.0.0.0 - 允许远程</option>
816
+ </select>
817
+ </div>
818
+ </div>
819
+ </div>
820
+
821
+ <!-- 【区块3.2:多连接 / 多实例】 -->
822
+ <div class="form-section" style="background:#f9f9f9;padding:16px;border-radius:6px;margin-bottom:16px;">
823
+ <h4 style="margin:0 0 12px 0;font-size:14px;font-weight:600;color:#666;">多连接 / 多实例</h4>
824
+
825
+ <div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px;">
826
+ <div style="display:flex;align-items:center;">
827
+ <label style="width:200px;font-size:13px;color:#666;flex-shrink:0;">最大连接数 <span style="font-size:11px;color:#999;">(max_connections)</span></label>
828
+ <select id="mod-meta-max-connections" data-field="max_connections" style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;">
829
+ <option value="1">1</option><option value="2">2</option><option value="3">3</option>
830
+ <option value="4">4</option><option value="5">5</option><option value="6">6</option>
831
+ <option value="7">7</option><option value="8">8</option><option value="9">9</option>
832
+ <option value="10">10</option>
833
+ </select>
834
+ </div>
835
+ <div style="display:flex;align-items:center;">
836
+ <label style="width:200px;font-size:13px;color:#666;flex-shrink:0;">弹性连接 <span style="font-size:11px;color:#999;">(connection_elastic)</span></label>
837
+ <select id="mod-meta-connection-elastic" data-field="connection_elastic" style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;">
838
+ <option value="false">不支持</option>
839
+ <option value="true">支持</option>
840
+ </select>
841
+ </div>
842
+ </div>
843
+
844
+ <div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:16px;">
845
+ <div style="display:flex;align-items:center;">
846
+ <label style="width:200px;font-size:13px;color:#666;flex-shrink:0;">最大实例数 <span style="font-size:11px;color:#999;">(max_instances)</span></label>
847
+ <select id="mod-meta-max-instances" data-field="max_instances" style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;">
848
+ <option value="1">1</option><option value="2">2</option><option value="3">3</option>
849
+ <option value="4">4</option><option value="5">5</option><option value="6">6</option>
850
+ <option value="7">7</option><option value="8">8</option><option value="9">9</option>
851
+ <option value="10">10</option>
852
+ </select>
853
+ </div>
854
+ <div style="display:flex;align-items:center;">
855
+ <label style="width:200px;font-size:13px;color:#666;flex-shrink:0;">弹性实例 <span style="font-size:11px;color:#999;">(instance_elastic)</span></label>
856
+ <select id="mod-meta-instance-elastic" data-field="instance_elastic" style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;">
857
+ <option value="false">不支持</option>
858
+ <option value="true">支持</option>
859
+ </select>
860
+ </div>
861
+ </div>
862
+
863
+ <!-- 操作按钮 -->
864
+ <div style="display:flex;gap:12px;align-items:center;border-top:1px solid #eee;padding-top:12px;">
865
+ <button type="button" id="btn-apply-multi-config" class="btn btn-sm btn-primary" style="padding:6px 16px;" onclick="app.applyMultiConfig()">应用</button>
866
+ <button type="button" id="btn-test-add-connection" class="btn btn-sm" style="padding:6px 16px;" onclick="app.testAddConnection()">增加连接</button>
867
+ <button type="button" id="btn-test-add-instance" class="btn btn-sm" style="padding:6px 16px;" onclick="app.testAddInstance()">增加实例</button>
868
+ <span id="multi-test-status" style="font-size:12px;color:#999;margin-left:8px;"></span>
869
+ </div>
870
+ </div>
871
+
872
+ <!-- 【区块3.5:扫描目录管理】(仅 launcher 显示) -->
873
+ <div class="form-section hidden" id="module-scan-dirs-section" style="background:#f9f9f9;padding:16px;border-radius:6px;margin-bottom:16px;">
874
+ <h4 style="margin:0 0 12px 0;font-size:14px;font-weight:600;color:#666;">扫描目录管理</h4>
875
+ <div id="scan-dirs-list" style="margin-bottom:12px;">
876
+ <!-- 动态生成目录列表 -->
877
+ </div>
878
+ <div style="display:flex;gap:8px;">
879
+ <input type="text" id="new-scan-dir" placeholder="输入新目录路径" style="flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;">
880
+ <button type="button" id="btn-add-scan-dir" class="btn btn-sm btn-success" style="padding:8px 16px;">添加</button>
881
+ </div>
882
+ </div>
883
+
884
+ <!-- 【区块4:模块配置文件】 -->
885
+ <div class="form-section hidden" id="module-config-section" style="background:#f9f9f9;padding:16px;border-radius:6px;">
886
+ <h4 style="margin:0 0 12px 0;font-size:14px;font-weight:600;color:#666;">业务参数配置</h4>
887
+ <div id="business-selector" class="hidden" style="margin-bottom:12px;">
888
+ <select id="business-select" style="padding:4px 8px;border:1px solid #ddd;border-radius:4px;font-size:13px;"></select>
889
+ </div>
890
+ <div id="module-config-tree"></div>
891
+ </div>
892
+
893
+ <!-- 【区块5:事件信息】 -->
894
+ <div class="form-section" id="module-events-section" style="background:#f9f9f9;padding:16px;border-radius:6px;margin-top:16px;">
895
+ <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;">
896
+ <h4 style="margin:0;font-size:14px;font-weight:600;color:#666;">事件信息</h4>
897
+ <button type="button" id="btn-refresh-events" class="btn btn-sm" style="padding:4px 12px;font-size:12px;">刷新</button>
898
+ </div>
899
+ <div id="module-events-content">
900
+ <div style="text-align:center;padding:20px;color:#999;">加载中...</div>
901
+ </div>
902
+ </div>
903
+ </div>
904
+ </section>
905
+
906
+ <!-- Token Management -->
907
+ <section id="page-tokens" class="page">
908
+ <h2 style="margin:0 0 20px 0;font-size:20px;font-weight:600;">Token 管理</h2>
909
+
910
+ <!-- 标签页导航 -->
911
+ <div class="tabs">
912
+ <button class="tab active" data-tab="kite">Kite Token</button>
913
+ <button class="tab" data-tab="evol">Evol Token</button>
914
+ <button class="tab" data-tab="auth">远程接入 Token</button>
915
+ </div>
916
+
917
+ <!-- Kite Token 标签页 -->
918
+ <div class="tab-content active" id="tab-kite">
919
+ <div class="panel">
920
+ <div class="table-wrapper">
921
+ <table class="data-table" id="kite-tokens-table">
922
+ <thead>
923
+ <tr>
924
+ <th style="width:140px;">Token</th>
925
+ <th style="width:180px;">设备</th>
926
+ <th style="width:120px;">绑定手机号</th>
927
+ <th style="width:150px;">创建时间</th>
928
+ <th style="width:150px;">最后使用</th>
929
+ <th style="width:150px;">过期时间</th>
930
+ <th style="width:100px;">剩余有效期</th>
931
+ <th style="width:80px;">状态</th>
932
+ <th style="width:100px;">操作</th>
933
+ </tr>
934
+ </thead>
935
+ <tbody id="kite-tokens-tbody">
936
+ <tr><td colspan="9" class="text-muted" style="text-align:center;padding:40px;">加载中...</td></tr>
937
+ </tbody>
938
+ </table>
939
+ </div>
940
+ </div>
941
+ </div>
942
+
943
+ <!-- Evol Token 标签页 -->
944
+ <div class="tab-content" id="tab-evol">
945
+ <div class="panel">
946
+ <div class="table-wrapper">
947
+ <table class="data-table" id="evol-tokens-table">
948
+ <thead>
949
+ <tr>
950
+ <th style="width:140px;">Token</th>
951
+ <th style="width:120px;">手机号</th>
952
+ <th style="width:120px;">昵称</th>
953
+ <th style="width:100px;">积分</th>
954
+ <th style="width:100px;">VIP</th>
955
+ <th style="width:150px;">获取时间</th>
956
+ <th style="width:150px;">最后使用</th>
957
+ <th style="width:150px;">过期时间</th>
958
+ <th style="width:100px;">操作</th>
959
+ </tr>
960
+ </thead>
961
+ <tbody id="evol-tokens-tbody">
962
+ <tr><td colspan="9" class="text-muted" style="text-align:center;padding:40px;">加载中...</td></tr>
963
+ </tbody>
964
+ </table>
965
+ </div>
966
+ </div>
967
+ </div>
968
+
969
+ <!-- 远程接入 Token 标签页(Auth 模块管理的 Token:配对码 + Evol 账号) -->
970
+ <div class="tab-content" id="tab-auth">
971
+ <div class="panel">
972
+ <p style="margin:0 0 12px 0;color:#888;font-size:13px;">通过 Gateway 远程接入产生的 Token(配对码登录、Evol 手机号登录),由 Auth 模块统一管理。</p>
973
+ <div class="table-wrapper">
974
+ <table class="data-table" id="auth-tokens-table">
975
+ <thead>
976
+ <tr>
977
+ <th style="width:140px;">Token</th>
978
+ <th style="width:100px;">认证方式</th>
979
+ <th style="width:180px;">设备</th>
980
+ <th style="width:120px;">手机号</th>
981
+ <th style="width:80px;">角色</th>
982
+ <th style="width:80px;">信任等级</th>
983
+ <th style="width:140px;">创建时间</th>
984
+ <th style="width:140px;">最后使用</th>
985
+ <th style="width:100px;">剩余有效期</th>
986
+ <th style="width:100px;">操作</th>
987
+ </tr>
988
+ </thead>
989
+ <tbody id="auth-tokens-tbody">
990
+ <tr><td colspan="10" class="text-muted" style="text-align:center;padding:40px;">加载中...</td></tr>
991
+ </tbody>
992
+ </table>
993
+ </div>
994
+ </div>
995
+ </div>
996
+ </section>
997
+
998
+ <!-- LLM Test -->
999
+ <section id="page-llm-test" class="page">
1000
+ <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;">
1001
+ <h2 class="page-title" style="margin-bottom:0;">模型测试</h2>
1002
+ <button class="btn btn-sm btn-secondary" id="llm-test-toggle-config">配置 &#9654;</button>
1003
+ </div>
1004
+
1005
+ <div class="panel" id="llm-test-config-panel" style="display:none;">
1006
+ <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:16px;">
1007
+ <div>
1008
+ <label style="display:block;margin-bottom:6px;font-size:13px;font-weight:500;">提供商</label>
1009
+ <select id="llm-test-provider" style="width:100%;padding:8px;border:1px solid #ddd;border-radius:4px;font-size:13px;">
1010
+ <option value="openai">OpenAI</option>
1011
+ <option value="claude">Claude</option>
1012
+ <option value="gemini">Gemini</option>
1013
+ </select>
1014
+ </div>
1015
+
1016
+ <div>
1017
+ <label style="display:block;margin-bottom:6px;font-size:13px;font-weight:500;">Base URL</label>
1018
+ <input type="url" id="llm-test-base-url" placeholder="https://api.openai.com/v1" style="width:100%;padding:8px;border:1px solid #ddd;border-radius:4px;font-size:13px;">
1019
+ </div>
1020
+
1021
+ <div>
1022
+ <label style="display:block;margin-bottom:6px;font-size:13px;font-weight:500;">API Key</label>
1023
+ <form autocomplete="off" onsubmit="return false;" style="margin:0;">
1024
+ <input type="password" id="llm-test-api-key" placeholder="sk-..." style="width:100%;padding:8px;border:1px solid #ddd;border-radius:4px;font-size:13px;">
1025
+ </form>
1026
+ </div>
1027
+ </div>
1028
+
1029
+ <div style="display:grid;grid-template-columns:1fr 1fr;gap:16px;">
1030
+ <div>
1031
+ <label style="display:block;margin-bottom:6px;font-size:13px;font-weight:500;">Temperature</label>
1032
+ <input type="number" id="llm-test-temperature" value="0.7" min="0" max="2" step="0.1" style="width:100%;padding:8px;border:1px solid #ddd;border-radius:4px;font-size:13px;">
1033
+ </div>
1034
+
1035
+ <div>
1036
+ <label style="display:block;margin-bottom:6px;font-size:13px;font-weight:500;">Max Tokens</label>
1037
+ <input type="number" id="llm-test-max-tokens" value="1024" min="1" max="32000" step="1" style="width:100%;padding:8px;border:1px solid #ddd;border-radius:4px;font-size:13px;">
1038
+ </div>
1039
+ </div>
1040
+ </div>
1041
+
1042
+ <div class="panel" style="display:flex;gap:0;padding:0;overflow:hidden;">
1043
+ <div style="flex:1;min-width:0;padding:20px;">
1044
+ <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;">
1045
+ <h3 style="margin:0;font-size:16px;font-weight:600;">对话测试</h3>
1046
+ <button id="llm-test-clear" class="btn btn-sm btn-secondary">清空对话</button>
1047
+ </div>
1048
+
1049
+ <div id="llm-test-messages" style="min-height:400px;max-height:600px;overflow-y:auto;padding:16px;background:#ebebeb;border:1px solid #e0e0e0;border-radius:4px;margin-bottom:16px;">
1050
+ <div style="text-align:center;color:#999;padding:40px 0;">选择模型后开始对话</div>
1051
+ </div>
1052
+
1053
+ <div class="llm-test-footer">
1054
+ <textarea id="llm-test-input" class="llm-test-input" placeholder="输入消息... (Enter 发送,Shift+Enter 换行)" rows="3"></textarea>
1055
+ <div class="llm-test-footer-bar">
1056
+ <button id="llm-test-inspect" class="btn btn-sm btn-secondary" title="查看完整请求内容">{ }</button>
1057
+ <select id="llm-test-model" class="llm-test-model-select">
1058
+ <option value="">请先填入 API Key</option>
1059
+ </select>
1060
+ <div id="llm-test-stats" class="llm-test-stats" style="display:none;">
1061
+ <span class="stat-item" title="消息数量"><span class="stat-label">消息:</span> <span id="stat-messages">0</span></span>
1062
+ <span class="stat-item" title="工具调用次数"><span class="stat-label">工具:</span> <span id="stat-tools">0</span></span>
1063
+ <span class="stat-item" title="上下文占用" style="cursor:pointer;" id="stat-context-toggle"><span class="stat-label">上下文:</span> <span id="stat-context">0</span> tokens</span>
1064
+ </div>
1065
+ <button id="llm-test-send" class="btn btn-primary">发送</button>
1066
+ </div>
1067
+ </div>
1068
+ </div>
1069
+
1070
+ <div class="llm-test-sidebar">
1071
+ <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;">
1072
+ <h3 style="margin:0;font-size:14px;font-weight:600;color:#666;">会话</h3>
1073
+ <button id="llm-test-new-session" class="btn btn-sm btn-secondary">+ 新建</button>
1074
+ </div>
1075
+ <div id="llm-test-sessions" class="llm-test-session-list"></div>
1076
+ </div>
1077
+ </div>
1078
+
1079
+ <!-- 请求内容查看弹窗 -->
1080
+ <div id="llm-inspect-modal" class="modal-overlay hidden">
1081
+ <div class="modal" style="max-width:900px;height:80vh;width:90%;">
1082
+ <div class="modal-header">
1083
+ <h3 class="modal-title">请求内容</h3>
1084
+ <button class="modal-close" id="llm-inspect-close">&times;</button>
1085
+ </div>
1086
+ <div class="modal-body" style="padding:0;display:flex;flex:1;min-height:0;overflow:hidden;">
1087
+ <div id="llm-inspect-tree" class="inspect-tree"></div>
1088
+ <div id="llm-inspect-detail" class="inspect-detail">
1089
+ <div style="color:#999;padding:20px;">点击左侧节点查看内容</div>
1090
+ </div>
1091
+ </div>
1092
+ </div>
1093
+ </div>
1094
+ </section>
1095
+
1096
+ <!-- Registry Center -->
1097
+ <section id="page-registry" class="page">
1098
+ <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;">
1099
+ <h2 class="page-title" style="margin-bottom:0;">注册中心</h2>
1100
+ <div style="display:flex;align-items:center;gap:8px;">
1101
+ <input type="text" id="registry-search" placeholder="搜索路径或值..." style="padding:6px 12px;border:1px solid var(--gray-300);border-radius:4px;font-size:13px;width:240px;">
1102
+ <div class="btn-group" id="registry-view-toggle">
1103
+ <button class="btn btn-sm btn-secondary active" data-view="tree">树形</button>
1104
+ <button class="btn btn-sm btn-secondary" data-view="table">表格</button>
1105
+ </div>
1106
+ <button class="btn btn-sm btn-secondary" id="registry-refresh" title="刷新">刷新</button>
1107
+ </div>
1108
+ </div>
1109
+ <div class="panel" id="registry-stats" style="display:flex;gap:24px;padding:12px 20px;margin-bottom:16px;font-size:13px;color:var(--gray-600);">
1110
+ <span>模块: <strong id="registry-stat-modules">-</strong></span>
1111
+ <span>记录: <strong id="registry-stat-records">-</strong></span>
1112
+ <span>最后更新: <strong id="registry-stat-time">-</strong></span>
1113
+ </div>
1114
+ <div class="panel" id="registry-content" style="min-height:400px;padding:0;">
1115
+ <div id="registry-tree" style="padding:16px;"></div>
1116
+ <div id="registry-table" style="display:none;"></div>
1117
+ <div id="registry-loading" style="text-align:center;padding:60px 0;color:var(--gray-400);">加载中...</div>
1118
+ </div>
1119
+ </section>
1120
+
1121
+ <!-- Events Center -->
1122
+ <section id="page-events" class="page">
1123
+ <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;">
1124
+ <h2 class="page-title" style="margin-bottom:0;">事件中心</h2>
1125
+ <div style="display:flex;align-items:center;gap:8px;">
1126
+ <div class="btn-group" id="events-mode-toggle">
1127
+ <button class="btn btn-sm btn-secondary active" data-mode="realtime">实时</button>
1128
+ <button class="btn btn-sm btn-secondary" data-mode="history">历史</button>
1129
+ </div>
1130
+ <button class="btn btn-sm btn-secondary" id="events-pause">暂停</button>
1131
+ <button class="btn btn-sm btn-secondary" id="events-clear">清空</button>
1132
+ <span id="events-count" style="font-size:12px;color:var(--gray-500);">0 条</span>
1133
+ <span id="events-rate" style="font-size:12px;color:var(--gray-500);">0 evt/s</span>
1134
+ </div>
1135
+ </div>
1136
+ <div style="display:flex;gap:8px;margin-bottom:12px;flex-wrap:wrap;">
1137
+ <select id="events-filter-module" style="padding:4px 8px;border:1px solid var(--gray-300);border-radius:4px;font-size:12px;">
1138
+ <option value="">全部模块</option>
1139
+ </select>
1140
+ <select id="events-filter-type" style="padding:4px 8px;border:1px solid var(--gray-300);border-radius:4px;font-size:12px;">
1141
+ <option value="">全部类型</option>
1142
+ <option value="rpc">RPC</option>
1143
+ <option value="event">事件</option>
1144
+ </select>
1145
+ <input type="text" id="events-filter-keyword" placeholder="关键词..." style="padding:4px 8px;border:1px solid var(--gray-300);border-radius:4px;font-size:12px;width:180px;">
1146
+ </div>
1147
+ <div class="panel" style="padding:0;background:#1e1e1e;color:#d4d4d4;min-height:500px;max-height:70vh;overflow-y:auto;position:relative;" id="events-list-container">
1148
+ <div id="events-list-content" style="position:relative;"></div>
1149
+ <div id="events-list-empty" style="text-align:center;padding:60px 0;color:#666;">
1150
+ 等待事件...
1151
+ </div>
1152
+ </div>
1153
+ </section>
1154
+
1155
+ <!-- API Reference -->
1156
+ <!-- Logs Center -->
1157
+ <section id="page-logs" class="page">
1158
+ <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;">
1159
+ <h2 class="page-title" style="margin-bottom:0;">日志</h2>
1160
+ <div style="display:flex;align-items:center;gap:8px;">
1161
+ <button class="btn btn-sm btn-secondary" id="logs-refresh" title="刷新">刷新</button>
1162
+ </div>
1163
+ </div>
1164
+ <!-- 统计卡片 -->
1165
+ <div class="panel logs-stats" style="display:flex;gap:24px;padding:12px 20px;margin-bottom:16px;font-size:13px;color:var(--gray-600);">
1166
+ <span>模块: <strong id="logs-stat-modules">-</strong></span>
1167
+ <span>文件: <strong id="logs-stat-files">-</strong></span>
1168
+ <span>变更: <strong id="logs-stat-changes">-</strong></span>
1169
+ </div>
1170
+ <!-- Tab 切换 -->
1171
+ <div style="display:flex;align-items:center;gap:12px;margin-bottom:16px;">
1172
+ <div class="btn-group" id="logs-tab-toggle">
1173
+ <button class="btn btn-sm btn-secondary active" data-tab="files">文件浏览</button>
1174
+ <button class="btn btn-sm btn-secondary" data-tab="search">日志搜索</button>
1175
+ <button class="btn btn-sm btn-secondary" data-tab="changes">变更追踪</button>
1176
+ </div>
1177
+ </div>
1178
+ <!-- 文件浏览 Tab -->
1179
+ <div id="logs-tab-files" class="logs-tab-content">
1180
+ <div class="panel" style="min-height:400px;padding:0;">
1181
+ <div id="logs-files-list" style="padding:16px;">
1182
+ <div style="text-align:center;padding:60px 0;color:var(--gray-400);">加载中...</div>
1183
+ </div>
1184
+ </div>
1185
+ </div>
1186
+ <!-- 日志搜索 Tab -->
1187
+ <div id="logs-tab-search" class="logs-tab-content" style="display:none;">
1188
+ <div class="panel" style="padding:16px;margin-bottom:12px;">
1189
+ <div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;">
1190
+ <select id="logs-search-module" style="padding:6px 10px;border:1px solid var(--gray-300);border-radius:4px;font-size:13px;">
1191
+ <option value="">全部模块</option>
1192
+ </select>
1193
+ <input type="text" id="logs-search-keyword" placeholder="关键词或正则..." style="padding:6px 12px;border:1px solid var(--gray-300);border-radius:4px;font-size:13px;flex:1;min-width:200px;">
1194
+ <input type="text" id="logs-search-from" placeholder="开始时间 HH:MM" style="padding:6px 10px;border:1px solid var(--gray-300);border-radius:4px;font-size:13px;width:130px;">
1195
+ <input type="text" id="logs-search-to" placeholder="结束时间 HH:MM" style="padding:6px 10px;border:1px solid var(--gray-300);border-radius:4px;font-size:13px;width:130px;">
1196
+ <label style="font-size:12px;display:flex;align-items:center;gap:4px;"><input type="checkbox" id="logs-search-archive"> 含归档</label>
1197
+ <button class="btn btn-sm btn-primary" id="logs-search-btn">搜索</button>
1198
+ </div>
1199
+ </div>
1200
+ <div class="panel" style="min-height:300px;padding:0;">
1201
+ <div id="logs-search-results" style="padding:16px;">
1202
+ <div style="text-align:center;padding:60px 0;color:var(--gray-400);">输入条件后点击搜索</div>
1203
+ </div>
1204
+ </div>
1205
+ </div>
1206
+ <!-- 变更追踪 Tab -->
1207
+ <div id="logs-tab-changes" class="logs-tab-content" style="display:none;">
1208
+ <div class="panel" style="min-height:400px;padding:0;">
1209
+ <div id="logs-changes-list" style="padding:16px;">
1210
+ <div style="text-align:center;padding:60px 0;color:var(--gray-400);">加载中...</div>
1211
+ </div>
1212
+ </div>
1213
+ </div>
1214
+ </section>
1215
+
1216
+ <!-- Audit Center -->
1217
+ <section id="page-audit" class="page">
1218
+ <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;">
1219
+ <h2 class="page-title" style="margin-bottom:0;">审计</h2>
1220
+ <div style="display:flex;align-items:center;gap:8px;">
1221
+ <button class="btn btn-sm btn-secondary" id="audit-refresh" title="刷新">刷新</button>
1222
+ </div>
1223
+ </div>
1224
+ <!-- 统计卡片 -->
1225
+ <div class="panel audit-stats" style="display:flex;gap:24px;padding:12px 20px;margin-bottom:16px;font-size:13px;color:var(--gray-600);">
1226
+ <span>事件总数: <strong id="audit-stat-total">-</strong></span>
1227
+ <span>成功: <strong id="audit-stat-success" style="color:var(--success);">-</strong></span>
1228
+ <span>失败: <strong id="audit-stat-failure" style="color:var(--danger,#e74c3c);">-</strong></span>
1229
+ <span>存储: <strong id="audit-stat-storage">-</strong></span>
1230
+ </div>
1231
+ <!-- 筛选器 -->
1232
+ <div class="panel" style="padding:12px 16px;margin-bottom:12px;">
1233
+ <div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;">
1234
+ <select id="audit-filter-action" style="padding:6px 10px;border:1px solid var(--gray-300);border-radius:4px;font-size:13px;">
1235
+ <option value="">全部操作</option>
1236
+ <option value="module.started">module.started</option>
1237
+ <option value="module.stopped">module.stopped</option>
1238
+ <option value="module.crashed">module.crashed</option>
1239
+ <option value="module.registered">module.registered</option>
1240
+ <option value="module.unregistered">module.unregistered</option>
1241
+ <option value="module.offline">module.offline</option>
1242
+ <option value="module.ready">module.ready</option>
1243
+ <option value="module.degraded">module.degraded</option>
1244
+ <option value="module.recovered">module.recovered</option>
1245
+ <option value="registry.updated">registry.updated</option>
1246
+ <option value="watchdog.module.restarted">watchdog.module.restarted</option>
1247
+ <option value="watchdog.module.resource_warning">watchdog.module.resource_warning</option>
1248
+ <option value="watchdog.module.degraded_timeout">watchdog.module.degraded_timeout</option>
1249
+ </select>
1250
+ <select id="audit-filter-result" style="padding:6px 10px;border:1px solid var(--gray-300);border-radius:4px;font-size:13px;">
1251
+ <option value="">全部结果</option>
1252
+ <option value="success">成功</option>
1253
+ <option value="failure">失败</option>
1254
+ </select>
1255
+ <input type="text" id="audit-filter-actor" placeholder="操作者 ID..." style="padding:6px 10px;border:1px solid var(--gray-300);border-radius:4px;font-size:13px;width:150px;">
1256
+ <input type="text" id="audit-filter-resource" placeholder="资源 ID..." style="padding:6px 10px;border:1px solid var(--gray-300);border-radius:4px;font-size:13px;width:150px;">
1257
+ <button class="btn btn-sm btn-primary" id="audit-filter-btn">查询</button>
1258
+ <button class="btn btn-sm btn-secondary" id="audit-filter-reset">重置</button>
1259
+ </div>
1260
+ </div>
1261
+ <!-- 事件列表 -->
1262
+ <div class="panel" style="min-height:400px;padding:0;">
1263
+ <div id="audit-events-list" style="padding:0;">
1264
+ <div id="audit-loading" style="text-align:center;padding:60px 0;color:var(--gray-400);">加载中...</div>
1265
+ </div>
1266
+ </div>
1267
+ <!-- 分页 -->
1268
+ <div id="audit-pagination" style="display:flex;justify-content:space-between;align-items:center;padding:12px 0;font-size:13px;color:var(--gray-500);">
1269
+ <span id="audit-page-info"></span>
1270
+ <div style="display:flex;gap:6px;">
1271
+ <button class="btn btn-sm btn-secondary" id="audit-prev-page" disabled>上一页</button>
1272
+ <button class="btn btn-sm btn-secondary" id="audit-next-page" disabled>下一页</button>
1273
+ </div>
1274
+ </div>
1275
+ </section>
1276
+
1277
+ <!-- Terminal Panel -->
1278
+ <section id="page-terminal" class="page">
1279
+ <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;flex-shrink:0;">
1280
+ <h2 class="page-title" style="margin-bottom:0;">终端</h2>
1281
+ <div style="display:flex;align-items:center;gap:8px;">
1282
+ <button class="btn btn-sm btn-secondary" id="terminal-clear-btn">清空</button>
1283
+ <button class="btn btn-sm btn-secondary" id="terminal-scroll-bottom-btn">↓ 底部</button>
1284
+ </div>
1285
+ </div>
1286
+ <div id="terminal-container" style="background:#0d1117;border-radius:6px;padding:12px 16px;height:calc(100vh - 260px);overflow-y:auto;font-family:'Cascadia Code','Fira Code','Consolas',monospace;font-size:12.5px;line-height:1.5;color:#c9d1d9;">
1287
+ <div id="terminal-lines"></div>
1288
+ <div id="terminal-empty" style="color:var(--gray-500);text-align:center;padding-top:40px;">等待输出...</div>
1289
+ </div>
1290
+ <div style="display:flex;align-items:center;gap:8px;margin-top:6px;font-size:12px;color:var(--gray-400);flex-shrink:0;">
1291
+ <span id="terminal-status">未连接</span>
1292
+ <span style="margin-left:auto;">共 <strong id="terminal-line-count">0</strong> 行 / <strong id="terminal-byte-count">0 B</strong></span>
1293
+ </div>
1294
+ <div id="terminal-tabs" style="display:flex;flex-wrap:wrap;gap:6px;margin-top:8px;flex-shrink:0;padding:6px 0;min-height:36px;"></div>
1295
+ </section>
1296
+
1297
+ <!-- Test Center -->
1298
+ <section id="page-tests" class="page">
1299
+ <h2 class="page-title" style="margin-bottom:20px;">测试中心</h2>
1300
+
1301
+ <!-- Test Type Tabs -->
1302
+ <div style="display:flex;gap:8px;margin-bottom:20px;border-bottom:1px solid #333;">
1303
+ <button class="test-tab active" data-tab="module">模块测试</button>
1304
+ <button class="test-tab" data-tab="integration">集成测试</button>
1305
+ <button class="test-tab" data-tab="full">完整测试</button>
1306
+ </div>
1307
+
1308
+ <!-- Module Test Panel -->
1309
+ <div id="module-test-panel" class="test-panel">
1310
+ <div class="test-controls">
1311
+ <label>选择模块:</label>
1312
+ <select id="test-module-select">
1313
+ <option value="kernel">Kernel</option>
1314
+ <option value="launcher">Launcher</option>
1315
+ <option value="watchdog">Watchdog</option>
1316
+ <option value="web">Web</option>
1317
+ <option value="backup">Backup</option>
1318
+ <option value="auth">Auth</option>
1319
+ <option value="gateway">Gateway</option>
1320
+ <option value="redis">Redis</option>
1321
+ </select>
1322
+ <button class="btn btn-sm btn-primary" id="btn-run-module-test">运行测试</button>
1323
+ <button class="btn btn-sm btn-secondary" id="btn-clear-test-output">清空输出</button>
1324
+ <button class="btn btn-sm btn-secondary" id="btn-copy-test-output">复制输出</button>
1325
+ </div>
1326
+ </div>
1327
+
1328
+ <!-- Integration Test Panel -->
1329
+ <div id="integration-test-panel" class="test-panel" style="display:none;">
1330
+ <div class="test-controls">
1331
+ <label>选择测试:</label>
1332
+ <select id="test-integration-select">
1333
+ <option value="registry-core">注册中心核心功能</option>
1334
+ <option value="pingpong">Ping-Pong 机制</option>
1335
+ <option value="auth">认证机制</option>
1336
+ <option value="full-workflow">完整流程</option>
1337
+ <option value="channel-interaction">Channel 交互测试</option>
1338
+ <option value="nested-rpc">嵌套 RPC 调用</option>
1339
+ <option value="elastic-connection">弹性多连接控制</option>
1340
+ <option value="trace">链路追踪</option>
1341
+ <option value="remote-deploy">远程部署与双模式启动</option>
1342
+ <option value="require-init">system.require_init 流程</option>
1343
+ <option value="redis">Redis 集成测试</option>
1344
+ <option value="multi-instance">模块多实例机制</option>
1345
+ <option value="scaling-control">扩缩容控制面</option>
1346
+ </select>
1347
+ <button class="btn btn-sm btn-primary" id="btn-run-integration-test">运行测试</button>
1348
+ <button class="btn btn-sm btn-secondary" id="btn-clear-integration-output">清空输出</button>
1349
+ <button class="btn btn-sm btn-secondary" id="btn-copy-integration-output">复制输出</button>
1350
+ </div>
1351
+ </div>
1352
+
1353
+ <!-- Full Test Panel -->
1354
+ <div id="full-test-panel" class="test-panel" style="display:none;">
1355
+ <div class="test-controls">
1356
+ <button class="btn btn-sm btn-primary" id="btn-run-full-test">运行完整测试</button>
1357
+ <button class="btn btn-sm btn-secondary" id="btn-clear-full-output">清空输出</button>
1358
+ <button class="btn btn-sm btn-secondary" id="btn-copy-full-output">复制输出</button>
1359
+ <button class="btn btn-sm btn-secondary" id="btn-download-report">下载报告</button>
1360
+ </div>
1361
+ </div>
1362
+
1363
+ <!-- Test Output -->
1364
+ <div class="panel">
1365
+ <div id="test-output" style="background:#1e1e1e;color:#d4d4d4;padding:15px;border-radius:4px;font-family:monospace;font-size:13px;max-height:600px;overflow-y:auto;white-space:pre-wrap;"></div>
1366
+ </div>
1367
+ </section>
1368
+
1369
+ <!-- Health Panel -->
1370
+ <section id="page-health" class="page">
1371
+ <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;">
1372
+ <h2 class="page-title" style="margin-bottom:0;">健康检查</h2>
1373
+ <div style="display:flex;align-items:center;gap:8px;">
1374
+ <span id="health-last-update" style="font-size:12px;color:var(--gray-400);"></span>
1375
+ <button class="btn btn-sm btn-secondary" id="health-refresh">刷新</button>
1376
+ </div>
1377
+ </div>
1378
+ <!-- 系统概览条 -->
1379
+ <div class="panel" id="health-overview" style="display:flex;gap:24px;padding:14px 20px;margin-bottom:16px;font-size:13px;color:var(--gray-600);flex-wrap:wrap;">
1380
+ <span>运行时长: <strong id="health-uptime">-</strong></span>
1381
+ <span>模块总数: <strong id="health-module-count">-</strong></span>
1382
+ <span>在线: <strong id="health-online-count" style="color:var(--success);">-</strong></span>
1383
+ <span>降级: <strong id="health-degraded-count" style="color:var(--warning,#f39c12);">-</strong></span>
1384
+ <span>不健康: <strong id="health-unhealthy-count" style="color:var(--danger,#e74c3c);">-</strong></span>
1385
+ <span>总重启: <strong id="health-restart-count">-</strong></span>
1386
+ </div>
1387
+ <!-- 系统资源曲线 -->
1388
+ <div style="display:flex;gap:16px;margin-bottom:16px;">
1389
+ <div style="flex:1;border:1px solid var(--gray-200);border-radius:4px;padding:12px 16px;background:#fff;">
1390
+ <div style="display:flex;align-items:baseline;justify-content:space-between;margin-bottom:8px;">
1391
+ <span style="font-size:13px;font-weight:600;color:var(--gray-600);">CPU 使用率</span>
1392
+ <span id="health-cpu-current" style="font-size:18px;font-weight:700;color:#3498db;">-%</span>
1393
+ </div>
1394
+ <canvas id="health-cpu-chart" width="480" height="100" style="width:100%;height:100px;"></canvas>
1395
+ </div>
1396
+ <div style="flex:1;border:1px solid var(--gray-200);border-radius:4px;padding:12px 16px;background:#fff;">
1397
+ <div style="display:flex;align-items:baseline;justify-content:space-between;margin-bottom:8px;">
1398
+ <span style="font-size:13px;font-weight:600;color:var(--gray-600);">内存使用</span>
1399
+ <span id="health-mem-current" style="font-size:18px;font-weight:700;color:#27ae60;">-MB</span>
1400
+ </div>
1401
+ <canvas id="health-mem-chart" width="480" height="100" style="width:100%;height:100px;"></canvas>
1402
+ </div>
1403
+ </div>
1404
+ <!-- 模块卡片区 + 事件时间线 -->
1405
+ <div style="display:flex;gap:16px;">
1406
+ <!-- 模块健康卡片 -->
1407
+ <div style="flex:1;min-width:0;">
1408
+ <div id="health-module-cards" style="display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;">
1409
+ <div style="text-align:center;padding:40px 0;color:var(--gray-400);grid-column:1/-1;">加载中...</div>
1410
+ </div>
1411
+ </div>
1412
+ <!-- 事件时间线 -->
1413
+ <div style="width:340px;flex-shrink:0;">
1414
+ <div style="border:1px solid var(--gray-200);border-radius:4px;padding:12px 16px;background:#fff;">
1415
+ <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;">
1416
+ <strong style="font-size:13px;">事件时间线</strong>
1417
+ <button class="btn btn-sm btn-secondary" id="health-events-more" style="font-size:11px;padding:2px 8px;">加载更多</button>
1418
+ </div>
1419
+ <div id="health-timeline" style="max-height:600px;overflow-y:auto;font-size:12px;">
1420
+ <div style="text-align:center;padding:20px 0;color:var(--gray-400);">加载中...</div>
1421
+ </div>
1422
+ </div>
1423
+ </div>
1424
+ </div>
1425
+ <!-- 模块详情展开区 -->
1426
+ <div id="health-module-detail" style="display:none;margin-top:16px;padding:16px;border:1px solid var(--gray-200);border-radius:4px;background:#fff;">
1427
+ <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;">
1428
+ <strong id="health-detail-title" style="font-size:14px;"></strong>
1429
+ <button class="btn btn-sm btn-secondary" id="health-detail-close">关闭</button>
1430
+ </div>
1431
+ <div id="health-detail-content"></div>
1432
+ </div>
1433
+ </section>
1434
+
1435
+ <section id="page-api-ref" class="page">
1436
+ <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;">
1437
+ <h2 class="page-title" style="margin-bottom:0;">接口大全</h2>
1438
+ <div style="display:flex;align-items:center;gap:12px;">
1439
+ <span id="apiref-summary" style="font-size:13px;color:var(--gray-500);"></span>
1440
+ <input type="text" id="apiref-search" placeholder="搜索方法名、事件名..." style="padding:6px 12px;border:1px solid var(--gray-300);border-radius:4px;font-size:13px;width:280px;">
1441
+ </div>
1442
+ </div>
1443
+ <div id="apiref-module-chips" style="display:flex;gap:6px;margin-bottom:12px;flex-wrap:wrap;"></div>
1444
+ <div style="display:flex;align-items:center;gap:12px;margin-bottom:16px;">
1445
+ <div class="btn-group" id="apiref-tab-toggle">
1446
+ <button class="btn btn-sm btn-secondary active" data-tab="rpc">RPC 方法</button>
1447
+ <button class="btn btn-sm btn-secondary" data-tab="events">事件</button>
1448
+ </div>
1449
+ <div class="btn-group" id="apiref-group-toggle">
1450
+ <button class="btn btn-sm btn-secondary active" data-group="module">按模块</button>
1451
+ <button class="btn btn-sm btn-secondary" data-group="namespace">按命名空间</button>
1452
+ </div>
1453
+ </div>
1454
+ <div id="apiref-content" style="min-height:400px;">
1455
+ <div id="apiref-rpc"></div>
1456
+ <div id="apiref-events" style="display:none;"></div>
1457
+ <div id="apiref-loading" style="text-align:center;padding:60px 0;color:var(--gray-400);">加载中...</div>
1458
+ </div>
1459
+ </section>
1460
+ </div>
1461
+ </div>
1462
+
1463
+ <!-- 恢复默认值确认弹窗 -->
1464
+ <div id="reset-defaults-modal" class="modal-overlay hidden">
1465
+ <div class="modal" style="max-width:600px;">
1466
+ <div class="modal-header">
1467
+ <h3 class="modal-title">恢复默认值</h3>
1468
+ <button class="modal-close" id="reset-defaults-close">&times;</button>
1469
+ </div>
1470
+ <div class="modal-body">
1471
+ <p style="margin-bottom:16px;color:var(--gray-600);">以下配置将被恢复为默认值:</p>
1472
+ <table style="width:100%;border-collapse:collapse;">
1473
+ <thead>
1474
+ <tr style="background:var(--gray-100);border-bottom:1px solid var(--gray-300);">
1475
+ <th style="padding:8px;text-align:left;font-weight:600;">字段</th>
1476
+ <th style="padding:8px;text-align:left;font-weight:600;">当前值</th>
1477
+ <th style="padding:8px;text-align:left;font-weight:600;">默认值</th>
1478
+ </tr>
1479
+ </thead>
1480
+ <tbody id="reset-defaults-comparison">
1481
+ <!-- Dynamic content -->
1482
+ </tbody>
1483
+ </table>
1484
+ </div>
1485
+ <div class="modal-footer">
1486
+ <button class="btn btn-secondary" id="reset-defaults-cancel">取消</button>
1487
+ <button class="btn btn-primary" id="reset-defaults-confirm">确认恢复</button>
1488
+ </div>
1489
+ </div>
1490
+ </div>
1491
+
1492
+ <script src="js/dialog.js"></script>
1493
+ <script src="js/kernel-client.js?v=3"></script>
1494
+ <!-- Test Framework -->
1495
+ <script src="js/tests/test-runner.js"></script>
1496
+ <script src="js/tests/modules/kernel.js"></script>
1497
+ <script src="js/tests/modules/launcher.js"></script>
1498
+ <script src="js/tests/modules/watchdog.js"></script>
1499
+ <script src="js/tests/modules/web.js"></script>
1500
+ <script src="js/tests/modules/backup.js"></script>
1501
+ <script src="js/tests/modules/acp_channel.js"></script>
1502
+ <script src="js/tests/modules/phone_channel.js"></script>
1503
+ <script src="js/tests/modules/auth.js"></script>
1504
+ <script src="js/tests/modules/gateway.js"></script>
1505
+ <script src="js/tests/modules/redis.js"></script>
1506
+ <script src="js/tests/integration/registry-core.js"></script>
1507
+ <script src="js/tests/integration/pingpong.js"></script>
1508
+ <script src="js/tests/integration/auth.js"></script>
1509
+ <script src="js/tests/integration/full-workflow.js"></script>
1510
+ <script src="js/tests/integration/channel-interaction.js"></script>
1511
+ <script src="js/tests/integration/nested-rpc.js"></script>
1512
+ <script src="js/tests/integration/elastic-connection.js"></script>
1513
+ <script src="js/tests/integration/trace.js"></script>
1514
+ <script src="js/tests/integration/remote-deploy.js"></script>
1515
+ <script src="js/tests/integration/require-init.js"></script>
1516
+ <script src="js/tests/integration/redis.js"></script>
1517
+ <script src="js/tests/modules/multi_instance.js"></script>
1518
+ <script src="js/tests/integration/multi-instance.js"></script>
1519
+ <script src="js/tests/integration/scaling-control.js"></script>
1520
+ <script src="js/tests/index.js"></script>
1521
+ <script src="js/virtual-list.js"></script>
1522
+ <script src="js/evol-app.js?v=12"></script>
1523
+ </body>
1524
+ </html>