@agentunion/kite 1.5.0 → 1.6.1

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 (574) 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/__init__.py +9 -1
  492. package/kite_cli/builders/__init__.py +4 -0
  493. package/kite_cli/builders/base.py +67 -0
  494. package/kite_cli/builders/custom.py +31 -0
  495. package/kite_cli/builders/detector.py +56 -0
  496. package/kite_cli/builders/go.py +34 -0
  497. package/kite_cli/builders/gradle.py +41 -0
  498. package/kite_cli/builders/maven.py +36 -0
  499. package/kite_cli/builders/npm.py +44 -0
  500. package/kite_cli/builders/python.py +37 -0
  501. package/kite_cli/commands/BUILD_GUIDE.md +109 -0
  502. package/kite_cli/commands/build.py +142 -0
  503. package/kite_cli/commands/check.py +60 -0
  504. package/kite_cli/commands/config.py +156 -0
  505. package/kite_cli/commands/deps.py +58 -0
  506. package/kite_cli/commands/deps_install.py +7 -7
  507. package/kite_cli/commands/disable.py +162 -0
  508. package/kite_cli/commands/enable.py +162 -0
  509. package/kite_cli/commands/export.py +96 -0
  510. package/kite_cli/commands/import_cmd.py +110 -0
  511. package/kite_cli/commands/install.py +50 -23
  512. package/kite_cli/commands/install_skill.py +107 -0
  513. package/kite_cli/commands/list.py +128 -31
  514. package/kite_cli/commands/outdated.py +202 -0
  515. package/kite_cli/commands/search.py +33 -17
  516. package/kite_cli/commands/update.py +115 -2
  517. package/kite_cli/commands/venv_setup.py +6 -6
  518. package/kite_cli/commands/why.py +48 -0
  519. package/kite_cli/core/config_manager.py +145 -0
  520. package/kite_cli/core/downloader.py +32 -2
  521. package/kite_cli/main.py +153 -7
  522. package/kite_cli/utils/colors.py +153 -0
  523. package/kite_cli/utils/dependency_graph.py +209 -0
  524. package/kite_cli/utils/process.py +55 -0
  525. package/kite_cli/utils/progress.py +207 -0
  526. package/kite_cli/utils/table.py +101 -0
  527. package/launcher/count_lines.py +192 -43
  528. package/launcher/entry.py +4543 -2802
  529. package/launcher/logging_setup.py +54 -1
  530. package/launcher/module.md +32 -6
  531. package/launcher/module_scanner.py +93 -20
  532. package/launcher/process_manager.py +355 -76
  533. package/main.py +6 -0
  534. package/package.json +4 -1
  535. package/requirements.txt +41 -38
  536. package/scripts/auto-fix-deps.py +128 -0
  537. package/scripts/env-manager.js +25 -2
  538. package/scripts/final-test.js +78 -0
  539. package/scripts/setup-python-env.js +700 -191
  540. package/scripts/test-alluser.js +48 -0
  541. package/scripts/test-different-version.js +86 -0
  542. package/scripts/test-direct.js +63 -0
  543. package/scripts/test-extract-installer.js +28 -0
  544. package/scripts/test-install-log.js +54 -0
  545. package/scripts/test-installer.js +39 -0
  546. package/scripts/test-integration.js +250 -0
  547. package/scripts/test-real-install.js +210 -0
  548. package/scripts/test-targetdir.js +49 -0
  549. package/scripts/test-venv-real.js +47 -0
  550. package/scripts/test-venv-simple.js +57 -0
  551. package/scripts/test-wait.js +49 -0
  552. package/scripts/test-with-log.js +63 -0
  553. package/extensions/services/evol/config.yaml +0 -149
  554. package/extensions/services/evol/routes/routes_management_ws.py +0 -127
  555. package/extensions/services/evol/static/index_evol.html +0 -14
  556. package/extensions/services/evol/static/js/app.js +0 -6304
  557. package/extensions/services/evol/static/js/auth.js +0 -326
  558. package/extensions/services/evol/static/js/evol-app-fixed.js +0 -50
  559. package/extensions/services/evol/static/js/evol-app.js.bak +0 -1800
  560. package/extensions/services/evol/static/js/kernel-client-example.js +0 -228
  561. package/extensions/services/evol/static/js/main.js +0 -141
  562. package/extensions/services/evol/static/js/stats.js +0 -217
  563. package/extensions/services/evol/static/js/token-manager.js +0 -175
  564. package/extensions/services/proxy/CHANGELOG_20260308.md +0 -258
  565. package/extensions/services/proxy/_fix_prints.py +0 -133
  566. package/extensions/services/proxy/_fix_prints2.py +0 -87
  567. package/extensions/services/proxy/console_auth.py +0 -109
  568. package/extensions/services/proxy/logs/websocket.log +0 -260
  569. package/extensions/services/proxy/main.py +0 -240
  570. package/extensions/services/proxy/requirements.txt +0 -13
  571. package/extensions/services/web/config.yaml +0 -149
  572. /package/extensions/services/{evol → kite_console}/static/pairing.html +0 -0
  573. /package/extensions/services/{evol → kite_console}/static/test_registry.html +0 -0
  574. /package/extensions/services/{evol → kite_console}/static/test_relay.html +0 -0
@@ -0,0 +1,908 @@
1
+ # 握手认证方案
2
+
3
+ ## 架构模型
4
+
5
+ ```
6
+ 本地模块 ──connect──→ Kernel(仅 token 认证)
7
+ 远程模块 ──connect──→ Relay ──token──→ Kernel
8
+ ```
9
+
10
+ - Kernel 只认 token,永远不变
11
+ - 远程认证全部收敛在 Relay
12
+ - Kernel 和 Relay 对客户端暴露**完全相同的四步握手协议**
13
+
14
+ ## 握手流程
15
+
16
+ ```
17
+ ① 客户端 → WS connect
18
+ ② ← challenge(服务端主动推送)
19
+ ③ → connect 请求(含 nonce + 版本 + 身份 + 认证)
20
+ ④ ← hello-ok / 拒绝
21
+ ```
22
+
23
+ ### 时序图 1:本地模块握手(Token 认证)
24
+
25
+ ```mermaid
26
+ sequenceDiagram
27
+ participant L as Launcher
28
+ participant M as Module
29
+ participant K as Kernel
30
+
31
+ L->>M: stdin {token}
32
+ M->>K: WS connect
33
+ K-->>K: accept
34
+ K->>M: challenge {nonce, ts, timeout_ms}
35
+ M->>K: connect {nonce, protocol, client, auth:{method:"token", token}}
36
+ K-->>K: verify_token (hmac.compare_digest)
37
+ K-->>K: check protocol.min/max
38
+ K-->>K: check (device, channel) 并发
39
+ K->>M: hello-ok {protocol, kernel, identity, policy, features, snapshot}
40
+ Note over M,K: 已认证,正常通信
41
+ ```
42
+
43
+ ### 时序图 2:远程模块握手(配对码认证)
44
+
45
+ ```mermaid
46
+ sequenceDiagram
47
+ actor U as User
48
+ participant F as Frontend
49
+ participant R as Relay
50
+ participant K as Kernel
51
+
52
+ U->>F: 点击获取配对码
53
+ F->>R: request_code
54
+ R-->>R: generate code
55
+ R-->>R: 控制台输出 code (stdout)
56
+ R->>F: code_generated
57
+
58
+ U->>U: 看到配对码
59
+ U->>F: 输入配对码
60
+ F->>R: WS connect
61
+ R-->>R: accept
62
+ R->>F: challenge {nonce, ts}
63
+ F->>R: connect {nonce, protocol, auth:{method:"pairing_code", code:"482916"}}
64
+ R-->>R: verify code
65
+
66
+ rect rgb(240, 248, 255)
67
+ Note over R,K: Relay → Kernel 内部连接
68
+ R->>K: kernel.generate_tokens
69
+ K->>R: token
70
+ R->>K: WS connect
71
+ K->>R: challenge
72
+ R->>K: connect {auth:{method:"token"}}
73
+ K->>R: hello-ok
74
+ end
75
+
76
+ R->>F: hello-ok (透传 kernel 信息 + Relay 策略)
77
+ Note over F,K: 已认证,Relay 双向代理
78
+ ```
79
+
80
+ ### 时序图 3:AID 密码学认证(后续)
81
+
82
+ ```mermaid
83
+ sequenceDiagram
84
+ participant C as Client
85
+ participant R as Relay
86
+ participant K as Kernel
87
+
88
+ C->>R: WS connect
89
+ R-->>R: accept
90
+ R->>C: challenge {nonce, ts}
91
+ C-->>C: sign(privkey, "nonce:signed_at:aid")
92
+ C->>R: connect {nonce, protocol, auth:{method:"aid", aid, signature, signed_at}}
93
+ R-->>R: lookup aid → pubkey
94
+ R-->>R: verify signature
95
+ R-->>R: check signed_at (±10 min)
96
+ R-->>R: check nonce
97
+
98
+ rect rgb(240, 248, 255)
99
+ Note over R,K: Relay → Kernel 内部连接
100
+ R->>K: WS connect + token 认证
101
+ K->>R: hello-ok
102
+ end
103
+
104
+ R->>C: hello-ok
105
+ Note over C,K: 已认证,Relay 双向代理
106
+ ```
107
+
108
+ ### 时序图 4:同 ID 并发连接 — 踢旧连接
109
+
110
+ ```mermaid
111
+ sequenceDiagram
112
+ participant Old as Module (旧连接)
113
+ participant New as Module (新连接)
114
+ participant K as Kernel
115
+
116
+ Note over Old,K: 旧连接已认证,正常通信中
117
+
118
+ New->>K: WS connect
119
+ K->>New: challenge
120
+ New->>K: connect (同 id, 同 device, 同 channel)
121
+ K-->>K: 检测并发: device+channel 重复
122
+ K->>Old: {type:"kicked", reason:"replaced"}
123
+ K--xOld: close (code=4009)
124
+ Note over Old: 不应自动重连
125
+ K->>New: hello-ok
126
+ Note over New,K: 新连接正常通信
127
+ ```
128
+
129
+ ### 时序图 5:Token 轮换
130
+
131
+ ```mermaid
132
+ sequenceDiagram
133
+ participant M as Module
134
+ participant K as Kernel
135
+
136
+ Note over M,K: 首次连接(旧 token)
137
+ M->>K: WS connect
138
+ K->>M: challenge
139
+ M->>K: connect {auth:{token: "old-token"}}
140
+ K-->>K: verify old-token ✓
141
+ K-->>K: 决定轮换 token
142
+ K->>M: hello-ok {token_rotation: {new_token: "xxx", grace_period_ms: 300000}}
143
+ M-->>M: 保存 new_token
144
+
145
+ Note over M,K: 断线重连(使用新 token)
146
+ M->>K: WS connect
147
+ K->>M: challenge
148
+ M->>K: connect {auth:{token: "xxx"}}
149
+ K-->>K: verify new-token ✓
150
+ K->>M: hello-ok
151
+ ```
152
+
153
+ ### 时序图 6:速率限制(Relay)
154
+
155
+ ```mermaid
156
+ sequenceDiagram
157
+ participant A as Attacker
158
+ participant R as Relay
159
+
160
+ A->>R: connect (认证失败 1)
161
+ A->>R: connect (认证失败 2)
162
+ A->>R: connect (认证失败 3)
163
+ A->>R: connect (认证失败 4)
164
+ A->>R: connect (认证失败 5)
165
+ Note over R: 前 5 次无限制(间隔 ≥ 100ms)
166
+ A->>R: connect (认证失败 6)
167
+ Note over R: 触发退避:限制 1 秒
168
+
169
+ A->>R: connect
170
+ R->>A: 4029 rate limited {retry_after_ms: 1000}
171
+
172
+ Note over A,R: 1 秒后
173
+ A->>R: connect (认证失败 7)
174
+ Note over R: 退避升级:限制 2 秒
175
+
176
+ A->>R: connect
177
+ R->>A: 4029 rate limited {retry_after_ms: 2000}
178
+
179
+ Note over A,R: 退避持续翻倍,最长 5 分钟
180
+ ```
181
+
182
+ ### 第 ① 步:WS 连接
183
+
184
+ 客户端连接 `ws://{host}:{port}/ws`,Kernel/Relay accept 后立即进入第 ② 步。
185
+
186
+ ### 第 ② 步:challenge
187
+
188
+ ```json
189
+ {
190
+ "type": "challenge",
191
+ "nonce": "a1b2c3d4-uuid",
192
+ "ts": 1710000000000,
193
+ "timeout_ms": 10000
194
+ }
195
+ ```
196
+
197
+ - `nonce`:UUID,一次性使用,用后即废
198
+ - `ts`:服务端时间戳(毫秒),客户端可用于时钟偏移检测
199
+ - `timeout_ms`:客户端必须在此时间内完成第 ③ 步,否则关闭连接(code=4003)
200
+ - 服务端维护 pending nonce 池,nonce 被使用或超时后从池中移除
201
+
202
+ ### 第 ③ 步:connect 请求
203
+
204
+ ```json
205
+ {
206
+ "jsonrpc": "2.0",
207
+ "id": "connect-1",
208
+ "method": "connect",
209
+ "params": {
210
+ "nonce": "a1b2c3d4-uuid",
211
+ "protocol": {
212
+ "min": 1,
213
+ "max": 1
214
+ },
215
+ "client": {
216
+ "id": "web",
217
+ "type": "module",
218
+ "version": "0.5.0",
219
+ "platform": "python",
220
+ "device": "server-01",
221
+ "channel": "default"
222
+ },
223
+ "auth": {
224
+ "method": "token",
225
+ "token": "xxx"
226
+ }
227
+ }
228
+ }
229
+ ```
230
+
231
+ #### params 字段
232
+
233
+ | 字段 | 必填 | 说明 |
234
+ |------|------|------|
235
+ | `nonce` | ✅ | 回传 challenge 中的 nonce |
236
+ | `protocol` | ✅ | 协议版本范围,不传则握手失败 |
237
+ | `protocol.min` | ✅ | 客户端支持的最低协议版本 |
238
+ | `protocol.max` | ✅ | 客户端支持的最高协议版本 |
239
+ | `client` | ✅ | 客户端身份描述 |
240
+ | `client.id` | ✅ | 模块名 / 客户端标识 |
241
+ | `client.type` | ✅ | `"module"` / `"frontend"` / `"node"` |
242
+ | `client.version` | ✅ | 客户端版本号 |
243
+ | `client.device` | ❌ | 设备标识(同一模块多设备部署时区分) |
244
+ | `client.channel` | ❌ | 通道标识(同一设备多通道连接时区分) |
245
+ | `client.platform` | ❌ | `"python"` / `"nodejs"` / `"browser"` / `"binary"` |
246
+ | `client.runtime` | ❌ | 运行时信息,调试用 |
247
+ | `auth` | ✅ | 认证信息,见下方四种方式 |
248
+
249
+ #### 版本协商
250
+
251
+ Kernel/Relay 持有当前协议版本 `PROTOCOL_VERSION`(整数,以 Kernel 版本为基准)。
252
+
253
+ 协商逻辑:
254
+ - `protocol` 字段不存在 → 拒绝(code=4002,`"protocol field required"`)
255
+ - `client.max < PROTOCOL_VERSION` → 拒绝(code=4002,返回 `{"expected": PROTOCOL_VERSION}`)
256
+ - `client.min > PROTOCOL_VERSION` → 拒绝(code=4002,同上)
257
+ - 否则 → 协商成功,取 `min(client.max, PROTOCOL_VERSION)` 作为本次连接使用的版本号
258
+
259
+ ## 认证方式
260
+
261
+ ### 方式 1:Token(本地模块 → Kernel,Relay → Kernel)
262
+
263
+ Launcher 通过 stdin 分发 Kernel 生成的 token,模块用 token 认证。
264
+
265
+ ```json
266
+ {
267
+ "method": "token",
268
+ "token": "kernel-generated-token"
269
+ }
270
+ ```
271
+
272
+ Kernel 验证:`hmac.compare_digest(token, expected)`(时序安全比较)。
273
+
274
+ ### 方式 2:配对码(远程客户端 → Relay)
275
+
276
+ 流程:
277
+ 1. 用户在控制台前端选择"配对码登录"
278
+ 2. 点击获取配对码,Relay 生成 6 位配对码
279
+ 3. 配对码在**服务端控制台**输出,用户通过其他渠道看到
280
+ 4. 用户在前端输入配对码
281
+ 5. 前端在 connect 请求中携带
282
+
283
+ ```json
284
+ {
285
+ "method": "pairing_code",
286
+ "code": "482916"
287
+ }
288
+ ```
289
+
290
+ Relay 验证配对码后,从 Kernel 获取 token,建立代理连接。配对码有效期 5 分钟,一次性。
291
+
292
+ ### 方式 3:短信验证码(远程客户端 → Relay)
293
+
294
+ 机制同配对码,获取方式为手机短信。
295
+
296
+ ```json
297
+ {
298
+ "method": "sms",
299
+ "phone": "138xxxx1234",
300
+ "code": "592831"
301
+ }
302
+ ```
303
+
304
+ Relay 验证验证码 + 手机号在 owners 列表中。
305
+
306
+ ### 方式 4:AID 密码学登录(远程客户端 → Relay,后续增加)
307
+
308
+ 注册阶段:
309
+ 1. 客户端本地生成 Ed25519 密钥对
310
+ 2. 客户端选择一个 AID(AI Device ID)
311
+ 3. 通过已认证的连接(配对码/短信)提交 `{aid, public_key}` 给 Relay 完成绑定
312
+
313
+ 登录阶段:
314
+
315
+ ```json
316
+ {
317
+ "method": "aid",
318
+ "aid": "my-device-01",
319
+ "signature": "base64-ed25519-signature",
320
+ "signed_at": 1710000000000
321
+ }
322
+ ```
323
+
324
+ 签名内容:`"{nonce}:{signed_at}:{aid}"`
325
+
326
+ Relay 验证:
327
+ - 查找 AID 对应的公钥
328
+ - 验签
329
+ - `signed_at` 与服务端时间偏差 ≤ 10 分钟
330
+ - nonce 匹配且未使用
331
+
332
+ ### 方式 5:邮箱验证码(远程客户端 → Relay)
333
+
334
+ 机制同短信验证码,发送渠道为邮箱。
335
+
336
+ ```json
337
+ {
338
+ "method": "email",
339
+ "email": "user@example.com",
340
+ "code": "592831"
341
+ }
342
+ ```
343
+
344
+ Relay 验证验证码 + 邮箱在授权列表中。
345
+
346
+ ### 方式 6:OAuth 2.0(GitHub / Google / 企业 SSO)
347
+
348
+ 标准 Authorization Code Flow,适配到 WS 握手中。
349
+
350
+ #### 流程
351
+
352
+ ```mermaid
353
+ sequenceDiagram
354
+ actor U as User
355
+ participant F as Frontend
356
+ participant R as Relay
357
+ participant O as OAuth Provider<br/>(GitHub/Google)
358
+
359
+ U->>F: 点击 "GitHub 登录"
360
+ F->>R: HTTP GET /auth/oauth/github/authorize
361
+ R->>F: 302 redirect → GitHub OAuth 授权页
362
+ F->>O: 用户授权
363
+ O->>F: redirect callback?code=xxx&state=yyy
364
+ F->>R: HTTP GET /auth/oauth/callback?code=xxx&state=yyy
365
+ R-->>R: 验证 state(防 CSRF)
366
+ R->>O: POST /access_token {code, client_secret}
367
+ O->>R: {access_token}
368
+ R->>O: GET /user {access_token}
369
+ O->>R: {email, name, id}
370
+ R-->>R: 校验 email/id 是否在授权列表
371
+ R-->>R: 生成一次性 auth_ticket(60s 有效)
372
+ R->>F: {auth_ticket: "tic_xxx"}
373
+
374
+ Note over F,R: 切换到 WebSocket 握手
375
+ F->>R: WS connect
376
+ R->>F: challenge {nonce}
377
+ F->>R: connect {auth:{method:"oauth", ticket:"tic_xxx"}}
378
+ R-->>R: 验证 ticket(一次性)
379
+ R->>F: hello-ok {token_rotation:{new_token:"tok_xxx"}}
380
+ ```
381
+
382
+ #### connect 请求
383
+
384
+ ```json
385
+ {
386
+ "method": "oauth",
387
+ "provider": "github",
388
+ "ticket": "tic_xxx"
389
+ }
390
+ ```
391
+
392
+ `provider` 取值:`"github"` / `"google"` / `"microsoft"` / `"custom"`
393
+
394
+ #### 关键设计
395
+
396
+ - OAuth 的 HTTP 回调阶段生成**一次性 auth_ticket**(60 秒有效)
397
+ - 前端拿到 ticket 后走标准 WS 四步握手
398
+ - 这样 OAuth 的 HTTP 流程和 WS 握手协议完全解耦
399
+ - 必须验证 `state` 参数防止 CSRF 攻击
400
+
401
+ ### 方式 7:LDAP / Active Directory(企业内部)
402
+
403
+ LDAP 是同步验证,直接在 connect 请求中传用户名密码。
404
+
405
+ ```json
406
+ {
407
+ "method": "ldap",
408
+ "username": "zhangsan",
409
+ "password": "xxx",
410
+ "domain": "corp.example.com"
411
+ }
412
+ ```
413
+
414
+ Relay 收到后:
415
+ 1. 连接 LDAP 服务器(`ldap://corp.example.com`)
416
+ 2. `bind(username, password)` 验证
417
+ 3. 查询用户组/角色信息
418
+ 4. 校验是否有 Kite 访问权限
419
+ 5. 验证通过 → 颁发 kiteToken
420
+
421
+ LDAP 不需要 HTTP 回调,直接在 WS 握手中完成。
422
+
423
+ ### 方式 8:SAML 2.0(企业 SSO)
424
+
425
+ 同 OAuth 流程——HTTP 阶段完成 SAML 断言交换,生成 auth_ticket,WS 阶段用 ticket 完成握手。
426
+
427
+ ```json
428
+ {
429
+ "method": "saml",
430
+ "ticket": "tic_xxx"
431
+ }
432
+ ```
433
+
434
+ ### 方式 9:MFA/2FA(多因素认证)
435
+
436
+ 在其他认证方式的基础上增加第二步验证。客户端在 connect 请求中增加可选 `mfa_code` 字段。
437
+
438
+ ```json
439
+ {
440
+ "method": "oauth",
441
+ "ticket": "tic_xxx",
442
+ "mfa_code": "123456"
443
+ }
444
+ ```
445
+
446
+ Relay 验证 TOTP(Time-based One-Time Password)或短信验证码。高权限账户(role=admin)可强制要求 MFA。
447
+
448
+ ### 认证方式汇总
449
+
450
+ | method | 验证方式 | 实现阶段 | 适用场景 |
451
+ |--------|----------|----------|----------|
452
+ | `token` | Kite Token | ✅ 现有 | 本地模块 / 已登录重连 |
453
+ | `pairing_code` | 配对码 | ✅ 现有 | 首次登录(无外部依赖) |
454
+ | `sms` | 手机验证码 | ✅ 现有 | 手机号绑定用户 |
455
+ | `email` | 邮箱验证码 | 新增(简单) | 邮箱绑定用户 |
456
+ | `aid` | Ed25519 签名 | 后续 | 设备密钥认证 |
457
+ | `oauth` | OAuth 2.0 | 新增(中等) | GitHub/Google/企业 SSO |
458
+ | `ldap` | LDAP/AD | 新增(中等) | 企业内部用户目录 |
459
+ | `saml` | SAML 2.0 | 新增(较大) | 企业 SSO(复杂场景) |
460
+ | `mfa` | MFA/2FA | 新增(中等) | 高权限账户二次验证 |
461
+
462
+ ## hello-ok 响应
463
+
464
+ 认证通过后返回:
465
+
466
+ ```json
467
+ {
468
+ "jsonrpc": "2.0",
469
+ "id": "connect-1",
470
+ "result": {
471
+ "type": "hello-ok",
472
+ "protocol": 1,
473
+ "kernel": {
474
+ "version": "0.5.0",
475
+ "instance_id": "kite-abc123"
476
+ },
477
+ "identity": {
478
+ "module_id": "web",
479
+ "role": "module",
480
+ "device": "server-01",
481
+ "channel": "default"
482
+ },
483
+ "policy": {
484
+ "max_payload_bytes": 1048576,
485
+ "event_queue_size": 10000,
486
+ "ping_interval_ms": 5000
487
+ },
488
+ "features": {
489
+ "events": ["module.*", "system.*"],
490
+ "rpc_namespaces": ["kernel", "launcher", "watchdog"]
491
+ },
492
+ "snapshot": {
493
+ "modules": {
494
+ "launcher": {"status": "online", "version": "0.5.0"},
495
+ "web": {"status": "online", "version": "0.5.0"},
496
+ "watchdog": {"status": "online", "version": "0.3.1"},
497
+ "backup": {"status": "offline"}
498
+ },
499
+ "subscriptions": ["module.*", "system.*"],
500
+ "pending_events": 0
501
+ },
502
+ "token_rotation": {
503
+ "new_token": "new-token-xxx",
504
+ "grace_period_ms": 300000
505
+ }
506
+ }
507
+ }
508
+ ```
509
+
510
+ ### 字段说明
511
+
512
+ | 字段 | 必填 | 说明 |
513
+ |------|------|------|
514
+ | `type` | ✅ | 固定 `"hello-ok"` |
515
+ | `protocol` | ✅ | 协商后实际使用的协议版本 |
516
+ | `kernel` | ✅ | Kernel 信息(Relay 透传) |
517
+ | `kernel.version` | ✅ | Kernel 版本号 |
518
+ | `kernel.instance_id` | ✅ | 本次 Kernel 运行实例 ID |
519
+ | `identity` | ✅ | 服务端分配/确认的身份信息 |
520
+ | `identity.module_id` | ✅ | 分配的模块 ID |
521
+ | `identity.role` | ✅ | 角色(`"module"` / `"frontend"` / `"node"`) |
522
+ | `identity.device` | ❌ | 确认的设备标识 |
523
+ | `identity.channel` | ❌ | 确认的通道标识 |
524
+ | `policy` | ✅ | 连接策略限制,客户端应遵守 |
525
+ | `policy.max_payload_bytes` | ✅ | 单条消息最大字节数 |
526
+ | `policy.event_queue_size` | ✅ | 事件队列容量 |
527
+ | `policy.ping_interval_ms` | ✅ | 心跳间隔 |
528
+ | `features` | ✅ | 当前可用的事件和 RPC 能力 |
529
+ | `features.events` | ✅ | 可订阅的事件模式列表 |
530
+ | `features.rpc_namespaces` | ✅ | 可调用的 RPC 命名空间列表 |
531
+ | `snapshot` | ✅ | 系统状态快照 |
532
+ | `snapshot.modules` | ✅ | 所有模块的当前在线状态和版本 |
533
+ | `snapshot.subscriptions` | ✅ | 该连接当前的事件订阅列表(重连时恢复) |
534
+ | `snapshot.pending_events` | ✅ | 该模块在断线期间积压的事件数 |
535
+ | `token_rotation` | ❌ | 可选,存在时客户端必须保存新 token |
536
+ | `token_rotation.new_token` | ✅* | 新 token |
537
+ | `token_rotation.grace_period_ms` | ✅* | 旧 token 继续有效的时间窗口 |
538
+
539
+ snapshot 是初版字段,后续缺什么往里加,客户端不认识的字段忽略即可。
540
+
541
+ ## 同 ID 并发连接
542
+
543
+ 当同一 `client.id` 第二次连接时,按 `(device, channel)` 二元组判定:
544
+
545
+ | 情况 | 行为 |
546
+ |------|------|
547
+ | device 不同 | ✅ 共存,视为不同设备的合法并发 |
548
+ | device 相同,channel 不同 | ✅ 共存,视为同设备不同通道 |
549
+ | device 和 channel 都相同 | 踢掉**旧连接**,新连接正常进入 |
550
+
551
+ 被踢时旧连接收到:
552
+
553
+ ```json
554
+ {
555
+ "type": "kicked",
556
+ "reason": "replaced",
557
+ "new_device": "server-01",
558
+ "new_channel": "default"
559
+ }
560
+ ```
561
+
562
+ 然后关闭(code=4009)。客户端收到 code=4009 时**不应自动重连**。
563
+
564
+ ## Token 轮换
565
+
566
+ - Kernel/Relay 在 hello-ok 中可选携带 `token_rotation`
567
+ - 轮换时机由服务端决定(如 token 使用超过 N 天、或每次重连时轮换)
568
+ - 客户端收到 `new_token` 后:
569
+ 1. 立即保存 `new_token`
570
+ 2. 下次连接使用 `new_token`
571
+ 3. 旧 token 在 `grace_period_ms`(默认 5 分钟)内仍有效
572
+ - 服务端维护双 token 窗口:`{module_id: [current_token, old_token, old_expiry]}`
573
+
574
+ ## 连接速率限制
575
+
576
+ 速率限制仅在 **Relay** 层实施(远程连接唯一入口),Kernel 不做限制(本地模块由 Launcher 管理生命周期,无限制)。
577
+
578
+ ### IP 维度
579
+
580
+ 同一 IP 10 秒内最多 200 次连接。超限后拒绝连接(code=4029,reason=`"rate limited"`),10 秒窗口滑动。
581
+
582
+ ### 节点维度(认证失败退避)
583
+
584
+ 按 `(aid, device_id)` 二元组追踪认证失败次数:
585
+
586
+ | 连续失败次数 | 限制时长 | 说明 |
587
+ |-------------|---------|------|
588
+ | 1-5 | 无限制 | 每次尝试间隔至少 100ms |
589
+ | 6 | 1 秒 | 开始限制 |
590
+ | 7 | 2 秒 | 指数退避 ×2 |
591
+ | 8 | 4 秒 | |
592
+ | 9 | 8 秒 | |
593
+ | ... | ... | 持续翻倍 |
594
+ | N | min(2^(N-6), 300) 秒 | 最长 5 分钟 |
595
+
596
+ - 每次尝试之间间隔不足 100ms 的请求直接拒绝(不计入失败次数)
597
+ - 认证成功后重置计数器
598
+ - 限制期间的连接直接拒绝(code=4029,reason=`"rate limited"`,响应中携带 `retry_after_ms`)
599
+
600
+ 拒绝响应示例:
601
+
602
+ ```json
603
+ {
604
+ "jsonrpc": "2.0",
605
+ "id": "connect-1",
606
+ "error": {
607
+ "code": 4029,
608
+ "message": "rate limited",
609
+ "data": {
610
+ "retry_after_ms": 4000
611
+ }
612
+ }
613
+ }
614
+ ```
615
+
616
+ ## 错误码
617
+
618
+ 统一错误码体系,Kernel 和 Relay 共用:
619
+
620
+ | 关闭码 | 含义 | 客户端行为 |
621
+ |--------|------|-----------|
622
+ | 4001 | 认证失败(token/配对码/签名无效) | 清除凭据,不重连 |
623
+ | 4002 | 协议版本不兼容 | 不重连,提示升级 |
624
+ | 4003 | 握手超时(challenge 后未及时 connect) | 可重连 |
625
+ | 4009 | 被同 ID 新连接踢掉 | **不重连** |
626
+ | 4010 | nonce 无效(已使用或不匹配) | 可重连(获取新 nonce) |
627
+ | 4029 | 速率限制 | 等待 `retry_after_ms` 后重连 |
628
+
629
+ ## 安全增强特性
630
+
631
+ ### JWT 签名 Token
632
+
633
+ 将当前的随机 token 改为 JWT 格式,提供自包含和防篡改能力。
634
+
635
+ #### Token 格式
636
+
637
+ ```
638
+ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkZXZpY2UtMDEiLCJleHAiOjE3MTI1OTIwMDAsImlhdCI6MTcxMDAwMDAwMCwiZGV2aWNlX2lkIjoiZGV2LTAxIn0.signature
639
+ ```
640
+
641
+ #### Payload 结构
642
+
643
+ ```json
644
+ {
645
+ "sub": "device-01",
646
+ "exp": 1712592000,
647
+ "iat": 1710000000,
648
+ "device_id": "dev-01",
649
+ "auth_method": "oauth",
650
+ "trust_level": "medium"
651
+ }
652
+ ```
653
+
654
+ #### 优缺点
655
+
656
+ | 优点 | 缺点 |
657
+ |------|------|
658
+ | 自包含(无需查数据库) | 无法主动撤销(需要黑名单) |
659
+ | 防篡改(签名验证) | 体积大(~200 字节 vs 当前 ~40 字节) |
660
+ | 标准化(业界通用) | 泄露后无法更改 payload |
661
+
662
+ #### 实现方案
663
+
664
+ 使用 `PyJWT` 库,密钥从环境变量 `KITE_JWT_SECRET` 读取。
665
+
666
+ ### 异常检测
667
+
668
+ 监控 token 使用模式,检测异常行为并告警。
669
+
670
+ #### 检测规则
671
+
672
+ | 规则 | 阈值 | 动作 |
673
+ |------|------|------|
674
+ | IP 突变 | 同一 token 在 1 小时内从不同国家/地区访问 | 告警 + 要求重新认证 |
675
+ | 异常时段 | 凌晨 2-5 点访问(用户通常不活跃) | 记录日志 |
676
+ | 高频使用 | 1 分钟内超过 100 次请求 | 限流 + 告警 |
677
+ | 设备指纹变化 | 同一 token 的设备指纹突变 | 告警 + 要求重新认证 |
678
+
679
+ #### 实现方案
680
+
681
+ 后台任务每 5 分钟分析 token 使用记录(存储在 `token_usage.jsonl`),匹配规则引擎,触发告警事件。
682
+
683
+ ### 地理位置限制
684
+
685
+ Token 记录中增加 `allowed_countries` 字段,限制访问来源。
686
+
687
+ ```json
688
+ {
689
+ "token": "tok_xxx",
690
+ "allowed_countries": ["CN", "US"],
691
+ "allowed_regions": ["Asia/Shanghai", "America/New_York"]
692
+ }
693
+ ```
694
+
695
+ 验证时检查 IP 地理位置(使用 MaxMind GeoIP2 数据库),不在白名单内则拒绝。
696
+
697
+ ### 时钟偏移容忍
698
+
699
+ 客户端在收到 challenge 时获取服务端时间戳,自动校准本地时钟。
700
+
701
+ ```json
702
+ {
703
+ "type": "challenge",
704
+ "nonce": "xxx",
705
+ "ts": 1710000000000,
706
+ "client_offset": 0
707
+ }
708
+ ```
709
+
710
+ 客户端计算偏移:`client_offset = server_ts - local_ts`,在后续签名时使用校准后的时间。
711
+
712
+ AID 签名时间窗口:±10 分钟(正常)→ ±1 小时(极端偏移)。
713
+
714
+ ## 改造清单
715
+
716
+ ### Kernel 侧
717
+
718
+ | 改造项 | 涉及文件 | 说明 |
719
+ |--------|----------|------|
720
+ | challenge 推送 + nonce 池 | `kernel/server.py` | accept 后主动发 challenge,使用 TTL 字典维护 nonce(`expiringdict`,10000 容量,600s 过期) |
721
+ | `connect` 方法替代 `auth` | `kernel/server.py` | 新 connect 处理逻辑,含 nonce 校验 |
722
+ | 版本范围协商 | `kernel/server.py` | protocol.min/max 校验 + 版本选择 |
723
+ | hello-ok 响应 | `kernel/server.py` | 构建完整 hello-ok(含 snapshot) |
724
+ | 时序安全比较 | `kernel/registry_store.py` | `==` → `hmac.compare_digest()` |
725
+ | 同 ID 并发连接判定 | `kernel/server.py` + `kernel/event_hub.py` | (device, channel) 二元组判定 + 踢旧连接 |
726
+ | token 轮换双窗口 | `kernel/registry_store.py` | 维护 current + old token |
727
+ | URL query 移除 token | `kernel/server.py` | token 只通过 WS 消息体传输 |
728
+ | 速率限制 | `kernel/server.py` | 按 module_id 限制(10s 内最多 20 次认证尝试) |
729
+ | 审计日志 | `kernel/server.py` | 复用 Audit 模块,记录 `auth.*` 事件 |
730
+
731
+ ### Kite Console 模块(Relay 实现)
732
+
733
+ **注意**:握手认证方案在 `extensions/services/kite_console/` 模块中实现,不是 Web 或 Evol 模块。
734
+
735
+ | 改造项 | 涉及文件 | 说明 |
736
+ |--------|----------|------|
737
+ | challenge + connect 流程 | `kite_console/relay.py` | 实现统一四步握手 |
738
+ | 版本协商 + hello-ok | `kite_console/relay.py` | 对远程客户端做版本校验,透传 Kernel 信息 |
739
+ | token 轮换 | `kite_console/relay.py` | 滑动 30 天 + 绝对半年上限 |
740
+ | IP 速率限制 | `kite_console/relay.py` | 10s/200 次滑动窗口 |
741
+ | 节点认证失败退避 | `kite_console/relay.py` | (aid, device_id) 维度指数退避 |
742
+ | OAuth 2.0 认证 | `kite_console/oauth.py` | HTTP 授权流程 + state 验证(内存/JWT 双模式) |
743
+ | LDAP 认证 | `kite_console/ldap.py` | 连接 LDAP 服务器验证用户名密码 |
744
+ | SAML 认证 | `kite_console/saml.py` | SAML 断言交换 |
745
+ | MFA/2FA | `kite_console/mfa.py` | TOTP 验证,admin 强制 |
746
+ | 设备指纹 | `kite_console/fingerprint.py` | 前端 + 后端混合指纹 |
747
+ | JWT Token | `kite_console/auth_manager.py` | 使用 PyJWT 生成和验证 token |
748
+ | 异常检测 | `kite_console/anomaly.py` | 规则引擎,后台任务每 5 分钟分析 |
749
+ | 地理位置限制 | `kite_console/geo.py` | MaxMind GeoIP2 验证 IP 地理位置 |
750
+ | 时序安全比较 | `kite_console/auth_manager.py` | `hmac.compare_digest()` |
751
+ | Token 过期机制 | `kite_console/auth_manager.py` | 滑动 30 天 + 绝对半年 |
752
+ | JSONL 归档 | `kite_console/auth_manager.py` | 每月归档旧记录到 `archive/YYYY-MM.jsonl.gz` |
753
+ | Token 撤销实时性 | `kite_console/auth_manager.py` | 撤销时清除内存缓存 `_cache.pop(token)` |
754
+ | 审计日志 | `kite_console/relay.py` | 复用 Audit 模块,记录所有认证事件 |
755
+ | Relay 重定向 | `kite_console/relay.py` | challenge 中可选 redirect 字段 |
756
+
757
+ ### 模块客户端侧
758
+
759
+ | 改造项 | 涉及文件 | 说明 |
760
+ |--------|----------|------|
761
+ | 接收 challenge + 发 connect | 各模块 entry.py / server.py | 统一模式,改一个抄其他 |
762
+ | 处理 hello-ok | 同上 | 解析 policy + features(可选) |
763
+ | 处理 token 轮换 | 同上 | 收到 new_token 时保存 |
764
+ | 处理 code=4009 不重连 | 同上 | 被踢时终止重连 |
765
+
766
+ ### 前端 JS 侧
767
+
768
+ | 改造项 | 涉及文件 | 说明 |
769
+ |--------|----------|------|
770
+ | challenge → connect 流程 | `kernel-client.js` | 替代现有 pair/auth 消息 |
771
+ | hello-ok 解析 | `kernel-client.js` | 统一处理认证成功响应 |
772
+ | token 轮换 | `kernel-client.js` | 更新 localStorage 中的 token |
773
+ | code=4009 不重连 | `kernel-client.js` | 被踢时显示提示而非自动重连 |
774
+ | OAuth 登录流程 | `evol-app.js` + 新增 OAuth 页面 | HTTP 授权 → 获取 ticket → WS 握手 |
775
+
776
+ ## Token 管理统一
777
+
778
+ ### 现状
779
+
780
+ 当前 Evol 控制台已有 token 管理面板(`list_tokens`/`revoke_token` RPC),但只管理 kiteToken。
781
+
782
+ ### 统一方案
783
+
784
+ 三种远程登录方式(配对码、短信、AID)认证成功后,都通过 AuthManager 颁发 kiteToken,记录中增加 `auth_method` 字段标识来源:
785
+
786
+ ```json
787
+ {
788
+ "token": "tok_xxx",
789
+ "auth_method": "pairing_code",
790
+ "deviceId": "...",
791
+ "deviceName": "...",
792
+ "device_fingerprint": "fp_xxx",
793
+ "phone": "13800138000",
794
+ "email": "user@example.com",
795
+ "oauth_provider": "github",
796
+ "trust_level": "medium",
797
+ "createdAt": 1710000000,
798
+ "lastUsedAt": 1710500000,
799
+ "expiresAt": 1712592000,
800
+ "isValid": true
801
+ }
802
+ ```
803
+
804
+ `auth_method` 取值:`"pairing_code"` / `"sms"` / `"email"` / `"aid"` / `"oauth"` / `"ldap"` / `"saml"` / `"mfa"`
805
+
806
+ ### Token 过期机制(滑动 + 绝对上限)
807
+
808
+ - **滑动窗口**:每次使用延期 30 天
809
+ - **绝对上限**:创建后最多 180 天(半年)强制过期
810
+ - **验证逻辑**:
811
+ ```python
812
+ now = time.time()
813
+ if now > created_at + 180 * 86400: # 超过半年
814
+ return False
815
+ if now > last_used_at + 30 * 86400: # 超过 30 天未使用
816
+ return False
817
+ # 验证通过,更新 last_used_at
818
+ ```
819
+
820
+ ### 设备信任等级
821
+
822
+ 根据认证方式自动分级:
823
+
824
+ | 认证方式 | trust_level | 说明 |
825
+ |---------|-------------|------|
826
+ | AID 密码学 | `high` | 设备密钥认证,最安全 |
827
+ | OAuth/LDAP/SAML | `medium` | 企业认证,较安全 |
828
+ | 配对码/短信/邮箱 | `low` | 验证码认证,基础安全 |
829
+
830
+ ### 设备指纹
831
+
832
+ 客户端在 connect 请求中携带 `device_fingerprint`:
833
+
834
+ - **浏览器**:Canvas/WebGL/字体指纹(使用 FingerprintJS)
835
+ - **原生应用**:硬件 UUID + 系统信息
836
+ - **后端计算**:IP + User-Agent + TLS 指纹
837
+
838
+ 混合指纹(前端 + 后端)提供最强识别能力。
839
+
840
+ ### 管理面板增强
841
+
842
+ - 按 `auth_method` 分组展示
843
+ - 支持按来源筛选(如只看 OAuth 登录的 token)
844
+ - 批量撤销(如撤销所有配对码登录的 token)
845
+ - 显示登录方式相关信息(OAuth 显示 provider,短信显示手机号)
846
+ - 显示设备指纹和信任等级
847
+
848
+ ### PairingManager 角色调整
849
+
850
+ PairingManager 退化为只负责配对码生成和验证,不再自己管 token。Token 统一由 AuthManager 管理。
851
+
852
+ ## Relay 负载均衡与重定向
853
+
854
+ ### challenge 中的 redirect 字段
855
+
856
+ ```json
857
+ {
858
+ "type": "challenge",
859
+ "nonce": "a1b2c3d4-uuid",
860
+ "ts": 1710000000000,
861
+ "timeout_ms": 10000,
862
+ "redirect": {
863
+ "url": "wss://relay-02.example.com/ws",
864
+ "reason": "load_balance"
865
+ }
866
+ }
867
+ ```
868
+
869
+ ### 客户端行为
870
+
871
+ 收到 `redirect` 时:
872
+ 1. 关闭当前连接
873
+ 2. 连接 `redirect.url`
874
+ 3. 在新连接上重新走完整四步握手(新 Relay 会发新的 challenge)
875
+
876
+ 不带 `redirect` 字段 → 在当前连接继续握手(默认行为)。
877
+
878
+ ### 重定向决策
879
+
880
+ Relay 的重定向决策可以基于:
881
+ - 当前连接数(超过阈值重定向)
882
+ - CPU/内存负载(繁忙时重定向)
883
+ - 外部负载均衡器的指令
884
+ - 维护模式(停机前把新连接全部重定向走)
885
+
886
+ ### 防重定向循环
887
+
888
+ 客户端维护重定向计数器,同一次连接尝试最多重定向 3 次,超过则报错。
889
+
890
+ ### 时序图
891
+
892
+ ```mermaid
893
+ sequenceDiagram
894
+ participant C as Client
895
+ participant R1 as Relay-01 (入口)
896
+ participant R2 as Relay-02 (目标)
897
+
898
+ C->>R1: WS connect
899
+ R1-->>R1: 负载判断:自身繁忙
900
+ R1->>C: challenge {redirect:{url:"wss://relay-02/ws"}}
901
+ C--xR1: 关闭连接
902
+ C-->>C: 重定向计数 +1
903
+
904
+ C->>R2: WS connect
905
+ R2->>C: challenge {nonce, ts}
906
+ C->>R2: connect {nonce, auth:{...}}
907
+ R2->>C: hello-ok
908
+ ```