@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,531 @@
1
+ # WebSocket 连接韧性与重连机制完整方案
2
+
3
+ > 状态:待实施
4
+ > 创建时间:2026-03-14
5
+ > 版本:v2.0(融合韧性方案 + 重连退避方案 + 断线检测增强)
6
+
7
+ ---
8
+
9
+ ## 一、方案概述
10
+
11
+ 本方案融合三个维度的连接管理机制:
12
+
13
+ 1. **连接韧性**:模块状态机、防抖机制、Launcher 异常恢复
14
+ 2. **重连退避**:三档策略(never/standard/cooldown)、错误码区段化、Jitter 防惊群
15
+ 3. **断线检测**:Ping/Pong 超时处理、握手超时控制、连接质量监控
16
+
17
+ 目标:构建一个优雅、健壮、完备的 WebSocket 连接管理体系。
18
+
19
+ ---
20
+
21
+ ## 二、错误码体系
22
+
23
+ ### 2.1 设计原则
24
+
25
+ - **1000-1011**:标准 WebSocket 关闭码
26
+ - **4001-4009**:认证类(Authentication)
27
+ - **4010-4019**:连接管理类(Connection)
28
+ - **4020-4029**:流控类(Flow Control)
29
+ - 每个区段预留扩展位
30
+
31
+ ### 2.2 完整错误码表
32
+
33
+ #### 标准 WebSocket 关闭码
34
+
35
+ | 码值 | 含义 | 重连策略 | 发送方 | 场景 |
36
+ |------|------|---------|--------|------|
37
+ | 1000 | 正常关闭 | never | Kernel | 优雅关闭流程完成 |
38
+ | 1001 | 服务器关闭 | standard | Kernel | Kernel 正在关闭 |
39
+ | 1008 | 策略违反 | never | Kernel / Relay | TLS 要求、权限拒绝 |
40
+ | 1011 | 服务器内部错误 | standard | Relay | 处理异常 |
41
+
42
+ #### 4001-4009 认证类
43
+
44
+ | 码值 | 含义 | 重连策略 | 发送方 | 场景 |
45
+ |------|------|---------|--------|------|
46
+ | 4001 | Token 无效 / 认证失败 | never | Kernel / Relay | Token 不存在、已过期、已吊销 |
47
+ | 4002 | 认证握手超时 | standard | Kernel | 5s 内未收到认证消息(网络抖动可恢复) |
48
+ | 4003 | 认证格式错误 | never | Kernel | jsonrpc/method/params 格式不合法 |
49
+ | 4004 | MFA 验证失败 | never | Relay | TOTP 码错误,需用户重新输入 |
50
+
51
+ #### 4010-4019 连接管理类
52
+
53
+ | 码值 | 含义 | 重连策略 | 发送方 | 场景 |
54
+ |------|------|---------|--------|------|
55
+ | 4010 | 连接被替换 | never | Kernel | 同一模块新连接覆盖旧连接 |
56
+ | 4011 | 队列压力强断 | standard | Kernel | critical 状态倒计时到期 |
57
+ | 4012 | Ping/Pong 超时 | standard | Kernel | 连续 N 次 Ping 无响应(新增) |
58
+
59
+ #### 4020-4029 流控类
60
+
61
+ | 码值 | 含义 | 重连策略 | 发送方 | 场景 |
62
+ |------|------|---------|--------|------|
63
+ | 4020 | 速率限制 | cooldown | Kernel / Relay | 10s 内同 IP/module_id 超 20 次认证 |
64
+
65
+ ### 2.3 旧码迁移映射
66
+
67
+ | 旧码 | 新码 | 变更说明 |
68
+ |------|------|---------|
69
+ | 4000 | **4010** | 连接被替换,移入连接管理区段 |
70
+ | 4001 | 4001 | 不变 |
71
+ | 4003(超时场景) | **4002** | 超时语义独立,可重试 |
72
+ | 4003(格式场景) | 4003 | 语义收窄为格式错误 |
73
+ | — | **4004** | 新增 MFA 失败 |
74
+ | 4010 | **4011** | 队列压力,让出 4010 给连接被替换 |
75
+ | 4029 | **4020** | 速率限制,归入流控区段 |
76
+ | — | **4012** | 新增 Ping/Pong 超时 |
77
+
78
+ ---
79
+
80
+ ## 三、连接韧性机制
81
+
82
+ ### 3.1 Kernel 模块状态机
83
+
84
+ Kernel 为每个模块维护完整的生命周期状态:
85
+
86
+ ```
87
+ offline → connected → registered → ready
88
+ ↑ │
89
+ └────────────────────────┘ (WS 断开 → 5s 防抖 → offline,重连后从 connected 重走)
90
+ ```
91
+
92
+ | 状态 | 含义 | 触发条件 |
93
+ |------|------|---------|
94
+ | **offline** | 未连接 | 初始状态 / WS 断开 5s 后 |
95
+ | **connected** | WS 已连接 | 认证成功 |
96
+ | **registered** | 已注册 | subscribe + register 完成 |
97
+ | **ready** | 可提供服务 | 发布 module.ready |
98
+
99
+ **状态变更通知:**
100
+ - `offline` → `ready`:广播 `module.ready` 事件
101
+ - `ready` → `offline`:广播 `module.offline` 事件
102
+ - 这些是系统级事件,Kernel 自动推送给所有已连接模块
103
+
104
+ **RPC 路由保护:**
105
+ - 外部调用某模块 RPC 时,Kernel 检查目标模块状态
106
+ - 如果不是 `ready`,立即返回错误码 `-32001`(模块离线),不等待超时
107
+
108
+ ### 3.2 防抖机制(5s)
109
+
110
+ 模块 WS 断开后,Kernel 不立即标记 offline,而是等待 **5s**:
111
+
112
+ - **5s 内重连**:取消防抖,状态从断开前继续,不发送 `module.offline` 事件
113
+ - **5s 后未重连**:标记 `offline`,广播 `module.offline` 事件
114
+
115
+ **实现位置:** `kernel/server.py` `_debounce_offline()` 方法
116
+
117
+ ### 3.3 Launcher 异常终止保护(35s)
118
+
119
+ Launcher 是 Kite 实例的生命线,其断连需要特殊处理:
120
+
121
+ | 阶段 | 时机 | 动作 |
122
+ |------|------|------|
123
+ | 防抖等待 | 0~5s | 等待重连,不通知 |
124
+ | 离线通知 | 5s | 广播 `module.offline (launcher)` |
125
+ | 重连窗口 | 5~35s | 继续等待 Launcher 重连 |
126
+ | 优雅退出 | 35s | 触发全实例优雅退出流程 |
127
+
128
+ **优雅退出流程(35s 触发):**
129
+
130
+ 1. Kernel 向所有模块发布 `module.shutdown`(reason: `launcher_lost`)
131
+ 2. 等待各模块优雅退出(保存状态、清理资源、ack)
132
+ 3. 等待 10s 超时后,Kernel 自己退出
133
+
134
+ **Watchdog 的异常恢复逻辑:**
135
+
136
+ ```
137
+ Launcher WS 断开
138
+ → [0~5s] Kernel 防抖等待
139
+ → [5s] Kernel 广播 module.offline (launcher)
140
+ → Watchdog 收到,标记状态,不做决策
141
+ → [5~35s] Kernel 继续等待 Launcher 重连
142
+ → [35s] Kernel 触发优雅退出,发布 module.shutdown (reason: launcher_lost)
143
+ → Watchdog 收到 module.shutdown,判断:
144
+ 有 module.exiting (launcher) → 正常退出 → 跟随退出
145
+ 无 module.exiting (launcher) → 异常退出 → 启动新 Kite 实例
146
+ ```
147
+
148
+ **正常 vs 异常退出的判断依据:**
149
+ - **正常退出**:Launcher 在断开前发送过 `module.exiting` 事件
150
+ - **异常退出**:Launcher 直接断开,没有 `module.exiting`(崩溃、被 kill)
151
+
152
+ **实现位置:**
153
+ - `kernel/server.py` `_launcher_loss_timeout()` 方法
154
+ - `extensions/services/watchdog/monitor.py` `_handle_launcher_lost()` 方法
155
+
156
+ ### 3.4 残留清理顺序
157
+
158
+ 新 Launcher 启动时清理上一个实例的残留进程,按依赖关系排序:
159
+
160
+ | 顺序 | 模块 | 理由 |
161
+ |------|------|------|
162
+ | 1 | Watchdog | 防止清理过程中 Watchdog 自动恢复其他模块 |
163
+ | 2 | 普通模块 | 顺序无所谓 |
164
+ | 3 | Kernel | 最后杀,防止连锁退出导致其他模块状态不可控 |
165
+
166
+ **实现位置:** `launcher/process_manager.py` `_get_process_dependencies()` 方法
167
+
168
+ ---
169
+
170
+ ## 四、重连退避机制
171
+
172
+ ### 4.1 三档策略总览
173
+
174
+ | 策略 | 适用场景 | 行为 |
175
+ |------|---------|------|
176
+ | **never** | 永久性错误,重试无意义 | 立即停止,不重连 |
177
+ | **standard** | 临时性错误,可自动恢复 | 指数退避 + Jitter |
178
+ | **cooldown** | 速率限制,需等待冷却 | 固定等待,有限重试 |
179
+
180
+ ### 4.2 错误码 → 策略映射
181
+
182
+ | 策略 | 错误码 |
183
+ |------|--------|
184
+ | never | 1000, 1008, 4001, 4003, 4004, 4010 |
185
+ | standard | 1001, 1011, 4002, 4011, 4012, 网络断开(无码) |
186
+ | cooldown | 4020 |
187
+
188
+ ### 4.3 参数定义
189
+
190
+ **内部模块** = Python 模块连 Kernel(localhost,网络可靠,Kernel 重启秒级恢复)
191
+ **远程模块** = JS 前端连 Relay(跨网络,延迟高,抖动多)
192
+
193
+ #### never
194
+
195
+ | 参数 | 内部模块 | 远程模块 |
196
+ |------|---------|---------|
197
+ | 最大重试 | 0 | 0 |
198
+ | 行为 | 设 `_shutting_down = True`,退出进程 | 设 `fatalError = true`,停止重连 |
199
+
200
+ #### standard
201
+
202
+ | 参数 | 内部模块(Python) | 远程模块(JS) |
203
+ |------|-------------------|---------------|
204
+ | 初始延迟 | 0.5s | 1.0s |
205
+ | 增长因子 | ×2 | ×2 |
206
+ | 最大延迟 | 10s | 15s |
207
+ | 最大重试 | 无限制 | 无限制 |
208
+ | Jitter | 0.2(±20%) | 0.2(±20%) |
209
+
210
+ 退避公式:
211
+
212
+ ```
213
+ base = initial_delay × factor ^ (attempt - 1)
214
+ jitter = base × jitter_ratio × random()
215
+ delay = min(base + jitter, max_delay)
216
+ ```
217
+
218
+ 退避序列(不含 jitter):
219
+ - 内部:`0.5 → 1.0 → 2.0 → 4.0 → 8.0 → 10.0 → 10.0 → ...`
220
+ - 远程:`1.0 → 2.0 → 4.0 → 8.0 → 15.0 → 15.0 → ...`
221
+
222
+ #### cooldown
223
+
224
+ | 参数 | 内部模块(Python) | 远程模块(JS) |
225
+ |------|-------------------|---------------|
226
+ | 初始延迟 | 10s | 10s |
227
+ | 增长因子 | ×1(固定) | ×1(固定) |
228
+ | 最大延迟 | 10s | 10s |
229
+ | 最大重试 | 5 | 5 |
230
+ | Jitter | 0 | 0 |
231
+
232
+ cooldown 达到最大重试次数后,转为 never(停止重连)。
233
+
234
+ ### 4.4 重连成功后的重置
235
+
236
+ 连接成功并完成认证后,重置所有计数器:
237
+
238
+ - `attempt = 0`
239
+ - `retry_delay = initial_delay`
240
+ - `cooldown_attempts = 0`
241
+
242
+ ---
243
+
244
+ ## 五、断线检测机制
245
+
246
+ ### 5.1 三层检测体系
247
+
248
+ | 层级 | 机制 | 间隔 | 超时 | 作用 | 局限 |
249
+ |------|------|------|------|------|------|
250
+ | **网络层** | WebSocket Ping/Pong | 动态 5~60s | 5s | 检测 TCP 连接存活 | 无法检测应用层僵死 |
251
+ | **应用层** | system.ping 事件 | 同上 | 5s | 检测事件循环响应 | 无法检测业务逻辑卡死 |
252
+ | **业务层** | Watchdog Health RPC | 15s/5s/2s | 5s | 检测业务处理能力 | 需要模块实现 health 接口 |
253
+
254
+ ### 5.2 Ping/Pong 机制详解
255
+
256
+ #### 动态间隔策略
257
+
258
+ Kernel 根据系统活跃度自动调整 Ping 间隔:
259
+
260
+ | 场景 | 间隔 | 触发条件 |
261
+ |------|------|---------|
262
+ | 活跃 | 5s | 最近 30s 内有 RPC 调用 |
263
+ | 空闲 | 60s | 超过 30s 无 RPC 调用 |
264
+
265
+ **实现位置:** `kernel/server.py` `_ping_broadcast_loop()` 方法(行 430-501)
266
+
267
+ #### Ping 流程
268
+
269
+ 1. Kernel 广播 `system.ping` 事件(含 `ping_time` 时间戳)
270
+ 2. 各模块收到后立即回复 `system.pong` 事件(含原始 `ping_time` + 自己的 `pong_time`)
271
+ 3. Kernel 等待 5s,检查哪些模块未响应
272
+ 4. 计算延迟统计:
273
+ - **outbound**:模块收到 ping 的延迟(`pong_time - ping_time`)
274
+ - **inbound**:Kernel 收到 pong 的延迟(`recv_time - pong_time`)
275
+
276
+ #### 超时处理(新增)
277
+
278
+ **当前状态:** Ping 超时仅记录统计,不触发断线
279
+
280
+ **新增机制:**
281
+
282
+ | 参数 | 值 | 说明 |
283
+ |------|-----|------|
284
+ | 连续超时阈值 | 3 次 | 连续 3 次 Ping 无响应 |
285
+ | 超时判定窗口 | 15s | 3 次 × 5s 间隔 |
286
+ | 触发动作 | 关闭连接 | 发送关闭码 4012 |
287
+
288
+ **实现逻辑:**
289
+
290
+ ```python
291
+ # kernel/server.py 新增字段
292
+ self._ping_timeout_counts = {} # module_id -> consecutive_timeout_count
293
+
294
+ async def _check_ping_timeouts(self):
295
+ for module_id in list(self.connections.keys()):
296
+ if module_id in self._ping_sent_times:
297
+ # 检查是否超时
298
+ if module_id not in self._pong_latencies or \
299
+ self._pong_latencies[module_id].get("last_update", 0) < self._ping_sent_times[module_id]:
300
+ # 超时
301
+ self._ping_timeout_counts[module_id] = self._ping_timeout_counts.get(module_id, 0) + 1
302
+
303
+ if self._ping_timeout_counts[module_id] >= 3:
304
+ # 连续 3 次超时,强制断开
305
+ print(f"[kernel] {module_id} ping timeout 3 times, closing connection")
306
+ ws = self.connections.get(module_id)
307
+ if ws:
308
+ await ws.close(code=4012, reason="Ping timeout")
309
+ else:
310
+ # 收到 pong,重置计数
311
+ self._ping_timeout_counts[module_id] = 0
312
+ ```
313
+
314
+ ### 5.3 握手超时控制
315
+
316
+ #### 当前实现
317
+
318
+ | 阶段 | 超时 | 错误码 | 实现位置 |
319
+ |------|------|--------|---------|
320
+ | 认证握手 | 5s | 4002 | `kernel/server.py:166` |
321
+ | Relay Challenge | 30s | 4000 | `relay.py` |
322
+
323
+ #### 新增:认证响应超时
324
+
325
+ **场景:** 模块发送认证请求后,Kernel 处理超时(如 token 验证卡死)
326
+
327
+ **实现:**
328
+
329
+ ```python
330
+ # kernel/server.py 认证处理
331
+ try:
332
+ raw = await asyncio.wait_for(ws.receive_text(), timeout=5.0)
333
+ auth_msg = _loads(raw)
334
+
335
+ # 验证 token(新增超时保护)
336
+ token = auth_msg["params"]["token"]
337
+ module_id = await asyncio.wait_for(
338
+ asyncio.get_event_loop().run_in_executor(
339
+ None, server.registry.verify_token, token
340
+ ),
341
+ timeout=2.0 # token 验证最多 2s
342
+ )
343
+
344
+ if module_id is None:
345
+ # 认证失败
346
+ await ws.close(code=4001, reason="Authentication failed")
347
+ return
348
+
349
+ except asyncio.TimeoutError:
350
+ # 握手超时或 token 验证超时
351
+ await ws.close(code=4002, reason="Auth timeout")
352
+ return
353
+ ```
354
+
355
+ ### 5.4 连接质量监控
356
+
357
+ Kernel 持续监控每个模块的连接质量:
358
+
359
+ | 指标 | 存储位置 | 用途 |
360
+ |------|---------|------|
361
+ | Ping 延迟(outbound/inbound) | `_pong_latencies` | 网络质量评估 |
362
+ | Ping 状态(ok/timeout/never) | `_pong_status` | 连接健康度 |
363
+ | 连续超时次数 | `_ping_timeout_counts` | 触发强制断开 |
364
+
365
+ **查询接口:** `kernel.get_connection_stats` RPC 方法(可新增)
366
+
367
+ ---
368
+
369
+ ## 六、实施清单
370
+
371
+ ### 6.1 Kernel 端变更
372
+
373
+ | 文件 | 变更内容 |
374
+ |------|---------|
375
+ | `kernel/server.py` | 1. 错误码迁移(4029→4020, 4003→4002, 4000→4010, 4010→4011)<br>2. 新增 4012(Ping 超时)<br>3. 新增 `_ping_timeout_counts` 字段<br>4. `_check_ping_timeouts()` 增加连续超时判断<br>5. 认证流程增加 token 验证超时保护 |
376
+ | `kernel/event_hub.py` | 错误码迁移(4000→4010, 4010→4011) |
377
+ | `kernel/registry_store.py` | 新增模块状态机(offline/connected/registered/ready) |
378
+
379
+ ### 6.2 Relay 端变更
380
+
381
+ | 文件 | 变更内容 |
382
+ |------|---------|
383
+ | `extensions/services/evol/relay.py` | 1. 4029→4020<br>2. 4003(MFA)→4004 |
384
+ | `extensions/services/kite_console/relay.py` | 同上 |
385
+ | `extensions/services/web/relay.py` | 同上(如有) |
386
+
387
+ ### 6.3 Python 模块端变更(7 个模块)
388
+
389
+ | 模块 | 文件 | 变更内容 |
390
+ |------|------|---------|
391
+ | backup | `extensions/services/backup/entry.py` | 统一重连参数 + 三档策略 |
392
+ | watchdog | `extensions/services/watchdog/entry.py` | 同上 |
393
+ | web | `extensions/services/web/server.py` | 同上 |
394
+ | model_service | `extensions/services/model_service/entry.py` | 同上 |
395
+ | logs | `extensions/services/logs/server.py` | 同上 |
396
+ | audit | `extensions/services/audit/server.py` | 同上 |
397
+ | kite_console | `extensions/services/kite_console/server.py` | 同上 |
398
+
399
+ 每个模块的改动:
400
+ 1. 参数更新:`retry_delay = 0.3` → `0.5`,`max_delay = 5.0` → `10.0`,删除 `max_retries = 10`
401
+ 2. 增加 Jitter:`import random`,sleep 时加 `retry_delay * 0.2 * random.random()`
402
+ 3. 错误分类:
403
+ - never:4001, 4003, 4004, 1008, 4010
404
+ - cooldown:4020(固定 10s,最多 5 次)
405
+ - standard:4002, 4011, 4012, 其他
406
+ 4. 删除 max_retries 上限
407
+
408
+ ### 6.4 JS 前端端变更(3 个文件)
409
+
410
+ | 服务 | 文件 | 变更内容 |
411
+ |------|------|---------|
412
+ | evol | `extensions/services/evol/static/js/kernel-client.js` | 统一重连参数 + 三档策略 |
413
+ | kite_console | `extensions/services/kite_console/static/js/kernel-client.js` | 同上 |
414
+ | web | `extensions/services/web/static/js/kernel-client.js` | 同上 |
415
+
416
+ 每个文件的改动:
417
+ 1. 参数更新:`maxReconnectDelay = 30000/10000` → `15000`,增长因子 `1.5` → `2`,新增 `jitterRatio = 0.2`
418
+ 2. 新增属性:`lastCloseCode = null`,`cooldownAttempts = 0`
419
+ 3. `_scheduleReconnect` 重写:按错误码分三档处理
420
+ 4. Web 端补齐 `fatalError` 机制
421
+
422
+ ---
423
+
424
+ ## 七、时间线示例
425
+
426
+ ### 场景 A:网络抖动,3s 后恢复
427
+
428
+ ```
429
+ T+0s 模块 WS 断开
430
+ T+3s 模块重连成功
431
+ → Kernel 未发任何通知(5s 防抖内)
432
+ → 对所有模块完全透明,无感知
433
+ ```
434
+
435
+ ### 场景 B:Launcher 崩溃,Watchdog 自动恢复
436
+
437
+ ```
438
+ T+0s Launcher 崩溃,WS 断开
439
+ T+5s Kernel 广播 module.offline (launcher)
440
+ Watchdog 标记,不行动
441
+ T+35s Kernel 触发优雅退出
442
+ Watchdog 判断:无 module.exiting → 异常退出 → 启动新实例
443
+ 其他模块收到 module.shutdown → 优雅退出
444
+ T+37s 新实例启动,清理残留(Watchdog → 普通模块 → Kernel)
445
+ T+40s 新实例完全就绪
446
+ ```
447
+
448
+ ### 场景 C:模块 Ping 连续超时
449
+
450
+ ```
451
+ T+0s Kernel 发送 Ping
452
+ T+5s 模块未响应,超时计数 = 1
453
+ T+10s Kernel 发送 Ping
454
+ T+15s 模块未响应,超时计数 = 2
455
+ T+20s Kernel 发送 Ping
456
+ T+25s 模块未响应,超时计数 = 3
457
+ → Kernel 强制断开连接(code 4012)
458
+ → 模块进入 standard 重连流程
459
+ ```
460
+
461
+ ### 场景 D:速率限制触发
462
+
463
+ ```
464
+ T+0s 模块快速重连 20 次
465
+ T+10s 第 21 次认证请求
466
+ → Kernel 返回 4020(速率限制)
467
+ → 模块进入 cooldown 策略,等待 10s
468
+ T+20s 第 1 次 cooldown 重试
469
+ → 仍在限制窗口内,再次 4020
470
+ T+30s 第 2 次 cooldown 重试
471
+ → 限制窗口过期,认证成功
472
+ ```
473
+
474
+ ---
475
+
476
+ ## 八、兼容性与迁移
477
+
478
+ ### 8.1 向后兼容
479
+
480
+ - 旧错误码在过渡期内保持兼容(Kernel 同时接受新旧码)
481
+ - 客户端优先处理新码,回退到旧码逻辑
482
+
483
+ ### 8.2 迁移步骤
484
+
485
+ 1. **第一阶段**:Kernel 端实施(错误码迁移 + Ping 超时 + 握手超时)
486
+ 2. **第二阶段**:Python 模块端实施(重连参数统一 + 三档策略)
487
+ 3. **第三阶段**:JS 前端端实施(重连参数统一 + 三档策略)
488
+ 4. **第四阶段**:Relay 端实施(错误码迁移)
489
+ 5. **第五阶段**:移除旧码兼容逻辑
490
+
491
+ ---
492
+
493
+ ## 九、监控与可观测性
494
+
495
+ ### 9.1 连接质量指标
496
+
497
+ | 指标 | 查询方式 | 用途 |
498
+ |------|---------|------|
499
+ | Ping 延迟 | `kernel.get_connection_stats` | 网络质量评估 |
500
+ | 超时次数 | 同上 | 连接稳定性 |
501
+ | 重连次数 | 模块日志 | 故障频率 |
502
+ | 模块状态 | `registry.list_modules` | 可用性监控 |
503
+
504
+ ### 9.2 日志规范
505
+
506
+ | 事件 | 日志格式 | 级别 |
507
+ |------|---------|------|
508
+ | 认证失败 | `[module] 致命错误 (code {code}),退出` | ERROR |
509
+ | 速率限制 | `[module] 速率限制,{delay}s 后重试 ({attempt}/{max})` | WARN |
510
+ | Ping 超时 | `[kernel] {module_id} ping timeout {count} times` | WARN |
511
+ | 连接被替换 | `[kernel] Closed old connection for {module_id}` | INFO |
512
+ | 防抖取消 | `[kernel] {module_id} reconnected within debounce window` | INFO |
513
+
514
+ ---
515
+
516
+ ## 十、不做的事
517
+
518
+ - ❌ 不抽公共函数/共享库(遵守零共享代码依赖原则)
519
+ - ❌ 不改变 WebSocket 协议本身(仍使用 JSON-RPC 2.0)
520
+ - ❌ 不引入外部依赖(如 Redis、消息队列)
521
+ - ❌ 不改变模块间通信模式(仍通过 Kernel 中转)
522
+
523
+ ---
524
+
525
+ ## 十一、后续优化方向
526
+
527
+ 1. **自适应退避**:根据历史重连成功率动态调整退避参数
528
+ 2. **连接池**:支持模块多连接(负载均衡、故障转移)
529
+ 3. **断线预测**:基于 Ping 延迟趋势预测即将断线的连接
530
+ 4. **健康状态分级**:支持 healthy/degraded/unhealthy 三级状态
531
+ 5. **连接质量评分**:综合延迟、超时、重连频率计算连接质量分数
@@ -0,0 +1,169 @@
1
+ # Kite WebSocket 连接韧性方案
2
+
3
+ > 状态:待实施
4
+ > 创建时间:2026-03-04
5
+
6
+ ## 背景
7
+
8
+ 当前所有模块连接 Kernel 的 WebSocket 断开后直接 `sys.exit(1)` 退出,没有重连能力。Launcher 异常终止(崩溃、被 kill)后,所有子进程变成孤儿进程并连锁崩溃。残留清理顺序不合理(先杀 Kernel 导致其他模块连锁退出)。
9
+
10
+ 本方案从三个层面解决:WebSocket 重连机制、Launcher 异常终止善后、残留清理顺序。
11
+
12
+ ---
13
+
14
+ ## 1. WebSocket 断开重连机制
15
+
16
+ ### 1.1 Kernel 侧 — 模块状态机
17
+
18
+ Kernel 为每个模块维护生命周期状态:
19
+
20
+ ```
21
+ offline → connected → registered → ready
22
+ ↑ │
23
+ └────────────────────────┘ (WS 断开 → 5s 防抖 → offline,重连后从 connected 重走)
24
+ ```
25
+
26
+ | 状态 | 含义 |
27
+ |---|---|
28
+ | **offline** | 未连接(初始 / WS 断开防抖后确认离线) |
29
+ | **connected** | WS 已连接,尚未完成注册 |
30
+ | **registered** | subscribe + register 完成 |
31
+ | **ready** | 已发布 module.ready,可提供服务 |
32
+
33
+ **防抖机制:** 模块 WS 断开后,Kernel 不立即标记 offline,而是等待 **5s**。如果模块在 5s 内重连成功,则状态直接从断开前的状态继续,不发送 `module.offline` 事件。超过 5s 未重连,才标记 `offline` 并广播通知。
34
+
35
+ **状态变更通知:** 当模块状态变更为 `offline` 或 `ready` 时,Kernel 向所有模块广播事件(`module.offline` / `module.ready`)。这些属于系统级事件,Kernel 自动推送给所有已连接模块,不需要模块显式订阅。
36
+
37
+ **RPC 路由保护:** 外部通过 Kernel 调用某模块的 RPC 时,Kernel 检查目标模块状态。如果不是 `ready`,立即返回错误(如 `"error": "module_offline"`),不等待超时。
38
+
39
+ **`module.ready` 是可重复的生命周期事件:** 模块可能经历多次 `offline → ready` 循环(网络抖动、Kernel 重启等)。各模块应持续处理 `module.ready` / `module.offline` 事件,维护对其他模块的可用性认知。
40
+
41
+ ### 1.2 客户端模块 — 重连策略
42
+
43
+ 适用于所有连接 Kernel 的模块(Launcher、Watchdog、普通模块)。
44
+
45
+ **重连参数:**
46
+
47
+ - 指数退避:初始 0.3s,翻倍增长,上限 5s
48
+ - 最多 10 次重试,总耗时约 34s
49
+ - 具体间隔:`0.3 → 0.6 → 1.2 → 2.4 → 4.8 → 5 → 5 → 5 → 5 → 5`
50
+
51
+ **重连成功后的握手:** 重新执行完整流程 — subscribe → register → publish module.ready。模块内部业务状态保持不变,不需要重置。
52
+
53
+ **首次连接失败:** 与重连相同的退避策略和次数限制。超过后 `sys.exit(1)`。
54
+
55
+ **不重连的情况:**
56
+
57
+ - 收到 `module.shutdown` 事件后断开(被主动关闭)
58
+ - 认证失败(token 无效,Kernel 返回 4001/4003 等 WebSocket 关闭码)
59
+
60
+ **实现约束:** 由于零共享代码原则,每个模块独立实现重连逻辑。Python 模块可参考相同模式,Node.js/Binary 模块自行实现等效逻辑。
61
+
62
+ ---
63
+
64
+ ## 2. Launcher 异常终止后的处理
65
+
66
+ ### 2.1 Kernel 的行为
67
+
68
+ **两阶段响应:**
69
+
70
+ | 阶段 | 时机 | 动作 |
71
+ |---|---|---|
72
+ | 防抖等待 | Launcher WS 断开后 0~5s | 等待重连,不通知 |
73
+ | 离线通知 | 5s 未重连 | 广播 `module.offline (launcher)` |
74
+ | 重连窗口 | 5s~35s | 继续等待 Launcher 重连 |
75
+ | 优雅退出 | 35s 未重连 | 触发全实例优雅退出流程 |
76
+
77
+ **优雅退出流程(35s 触发):**
78
+
79
+ 1. Kernel 向所有模块发布 `module.shutdown`(reason: `launcher_lost`)
80
+ 2. 等待各模块优雅退出(保存状态、清理资源、ack)
81
+ 3. 等待超时后,Kernel 自己退出
82
+
83
+ ### 2.2 Watchdog 的行为
84
+
85
+ ```
86
+ Launcher WS 断开
87
+ → [0~5s] Kernel 防抖等待
88
+ → [5s] Kernel 广播 module.offline (launcher)
89
+ → Watchdog 收到,标记状态,不做决策(可能只是网络抖动)
90
+ → [5~35s] Kernel 继续等待 Launcher 重连
91
+ → [35s] Kernel 触发优雅退出,发布 module.shutdown (reason: launcher_lost)
92
+ → Watchdog 收到 module.shutdown,此时判断:
93
+ 有 module.exiting (launcher) → 正常退出 → 跟随退出
94
+ 无 module.exiting (launcher) → 异常退出 → 启动新 Kite 实例
95
+ ```
96
+
97
+ **正常 vs 异常退出的判断依据:**
98
+
99
+ - **正常退出:** Launcher 在断开前发送过 `module.exiting` 事件(包括 ESC、Ctrl+C、q 等主动退出)
100
+ - **异常退出:** Launcher 直接断开,没有 `module.exiting`(崩溃、被 kill、意外断电)
101
+
102
+ **ESC 退出的改造:** 当前 ESC 调用 `os._exit(0)` 什么都不发。需要改为:先发送 `module.exiting` 事件,再退出。这样 Kernel/Watchdog 能识别为正常退出。
103
+
104
+ **Watchdog 启动新实例:**
105
+
106
+ - 执行 `python main.py`(或等效命令)启动全新 Kite 实例
107
+ - 新实例自动清理旧实例的残留进程
108
+ - 整个恢复耗时约 2~3s(不含 35s 等待窗口)
109
+
110
+ ### 2.3 Launcher 重连成功的情况
111
+
112
+ 如果 Launcher 在 35s 内重连成功:
113
+
114
+ - Kernel 取消优雅退出计划
115
+ - 如果已发过 `module.offline (launcher)`(超过 5s),则再发一次 Launcher 的 `module.ready`
116
+ - 各模块(包括 Watchdog)清除之前标记的状态
117
+ - 整个实例恢复正常运行
118
+
119
+ ---
120
+
121
+ ## 3. 残留清理顺序
122
+
123
+ 新 Launcher 启动时清理上一个实例的残留进程,按以下顺序:
124
+
125
+ | 顺序 | 模块 | 理由 |
126
+ |---|---|---|
127
+ | 1 | Watchdog | 防止清理过程中 Watchdog 自动恢复其他模块 |
128
+ | 2 | 普通模块 | 顺序无所谓(assistant、backup、web 等) |
129
+ | 3 | Kernel | 最后杀,防止连锁退出导致其他模块状态不可控 |
130
+
131
+ **实现方式:** 在清理逻辑(`_cleanup_file`)中对 records 排序,不改 `processes.json` 的写入格式。排序规则:`watchdog` 排首位,`kernel` 排末位,其余保持原序。
132
+
133
+ ---
134
+
135
+ ## 整体时间线示例
136
+
137
+ ### 场景 A:Launcher 网络抖动,3s 后恢复
138
+
139
+ ```
140
+ T+0s Launcher WS 断开
141
+ T+3s Launcher 重连成功
142
+ → Kernel 未发任何通知(5s 防抖内)
143
+ → 对所有模块完全透明,无感知
144
+ ```
145
+
146
+ ### 场景 B:Launcher 崩溃,无法恢复
147
+
148
+ ```
149
+ T+0s Launcher 崩溃,WS 断开
150
+ T+5s Kernel 广播 module.offline (launcher)
151
+ Watchdog 标记,不行动
152
+ T+35s Kernel 触发优雅退出
153
+ Watchdog 判断:无 module.exiting → 异常退出 → 启动新实例
154
+ 其他模块收到 module.shutdown → 优雅退出
155
+ T+37s 新实例启动,清理残留(Watchdog → 普通模块 → Kernel)
156
+ T+40s 新实例完全就绪
157
+ ```
158
+
159
+ ### 场景 C:用户按 ESC 退出
160
+
161
+ ```
162
+ T+0s ESC 按下
163
+ Launcher 发送 module.exiting → 退出
164
+ T+5s Kernel 广播 module.offline (launcher)
165
+ T+35s Kernel 触发优雅退出
166
+ Watchdog 判断:有 module.exiting → 正常退出 → 跟随退出
167
+ 所有模块优雅退出
168
+ → 不启动新实例
169
+ ```