@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,496 @@
1
+ # 特性检查清单
2
+
3
+ 本清单供「生成新模块」「适配现有项目」「审查现有模块」三条主线共用。
4
+
5
+ ---
6
+
7
+ ## 一、module.md 规范性
8
+
9
+ | # | 检查项 | 严重度 | 说明 |
10
+ |---|--------|--------|------|
11
+ | 1.1 | name 字段存在且合法 | 🔴 致命 | 只允许 `[a-zA-Z0-9_-]` |
12
+ | 1.2 | type 字段值合法 | 🔴 致命 | service / channel / agent |
13
+ | 1.3 | runtime 字段值合法 | 🔴 致命 | python / node / binary |
14
+ | 1.4 | entry 字段指向存在的文件 | 🔴 致命 | 如 entry.py 必须存在 |
15
+ | 1.5 | version 用引号包裹 | 🟡 警告 | `'1.0'` 而非 `1.0`(避免被解析为浮点数) |
16
+ | 1.6 | max_connections 在 [1, 10] 范围内 | 🟡 警告 | 超出会被钳位 |
17
+ | 1.7 | max_instances 在 [1, 10] 范围内 | 🟡 警告 | > 10 会被安全阀重置为 1 |
18
+ | 1.8 | 未使用死字段 | 🟢 建议 | 不要用 connection_elastic / graceful_shutdown / tools |
19
+ | 1.9 | events 声明与代码中 publish 的事件一致 | 🟡 警告 | 声明了但没发布 = 误导 |
20
+ | 1.10 | subscriptions 声明与代码中 subscribe 的事件一致 | 🟡 警告 | 同上 |
21
+
22
+ ---
23
+
24
+ ## 二、entry.py 标准模式
25
+
26
+ | # | 检查项 | 严重度 | 说明 |
27
+ |---|--------|--------|------|
28
+ | 2.1 | 正确读取 module.md YAML frontmatter | 🔴 致命 | 使用 `---` 分隔符提取 |
29
+ | 2.2 | 验证 name 字段合法性 | 🔴 致命 | 正则 `[a-zA-Z0-9_-]+` |
30
+ | 2.3 | 安全 I/O 包装(_SafeWriter) | 🟡 警告 | 防止 BrokenPipeError 崩溃 |
31
+ | 2.4 | 覆盖 builtins.print 为带时间戳版本 | 🟢 建议 | 便于调试 |
32
+ | 2.5 | 日志目录创建(latest.log + daily) | 🟡 警告 | 路径:`{KITE_MODULE_DATA}/log/` |
33
+ | 2.6 | 崩溃日志(crashes.jsonl) | 🟡 警告 | 含 timestamp, module, traceback, platform |
34
+ | 2.7 | 设置 sys.excepthook | 🟡 警告 | 捕获未处理异常 |
35
+ | 2.8 | 设置 threading.excepthook | 🟢 建议 | 捕获线程中的异常 |
36
+ | 2.9 | 正确读取 stdin boot_info | 🔴 致命 | 一行 JSON:token + max_instances |
37
+ | 2.10 | 检查 error 消息 | 🔴 致命 | boot_info 中有 error 字段时 exit(1) |
38
+ | 2.11 | 验证 token 非空 | 🔴 致命 | 空 token 必须退出 |
39
+ | 2.12 | 支持本地模式(KITE_KERNEL_PORT) | 🔴 致命 | 读取环境变量获取端口 |
40
+ | 2.13 | 支持远程模式(KITE_GATEWAY_URL) | 🟢 可选 | 生产环境需要 |
41
+ | 2.14 | HTTP 服务端口绑定(如适用) | 🟡 警告 | 尝试 preferred → +1 → +2 → OS 分配 |
42
+ | 2.15 | uvicorn 启动配置正确(如适用) | 🟡 警告 | 传入预绑定 socket |
43
+
44
+ ---
45
+
46
+ ## 三、server.py WebSocket 连接
47
+
48
+ | # | 检查项 | 严重度 | 说明 |
49
+ |---|--------|--------|------|
50
+ | 3.1 | 认证消息格式正确 | 🔴 致命 | `{jsonrpc, id, method: "auth", params: {token}}` |
51
+ | 3.2 | 认证超时处理(5 秒) | 🟡 警告 | Kernel 在 5 秒后断开 |
52
+ | 3.3 | 认证失败码正确处理 | 🟡 警告 | 4001/4003/4010 不重试,4020 等 10 秒 |
53
+ | 3.4 | 等待 system.require_init 再初始化 | 🔴 致命 | 不能认证后直接初始化 |
54
+ | 3.5 | 初始化顺序正确 | 🔴 致命 | subscribe → register → publish ready |
55
+ | 3.5b | ⚠️ module.ready 必须包含 graceful_shutdown | 🔴 致命 | `{"module_id": ..., "graceful_shutdown": True, "startup_time": ..., "reason": "startup"}` 缺少会被 Launcher 直接杀进程! |
56
+ | 3.6 | 重连逻辑:指数退避 + 抖动 | 🟡 警告 | 0.3s → 5s max,max 10 retries |
57
+ | 3.7 | Windows 连接拒绝处理 | 🟡 警告 | 处理 WinError 1225 |
58
+ | 3.8 | 断开时清理 pending_rpc | 🟡 警告 | 避免 future 永久挂起 |
59
+
60
+ ---
61
+
62
+ ## 四、server.py 消息接收循环
63
+
64
+ | # | 检查项 | 严重度 | 说明 |
65
+ |---|--------|--------|------|
66
+ | 4.1 | 正确区分三类消息 | 🔴 致命 | RPC 请求(method+id) / 事件(method无id) / RPC 响应(id+result) |
67
+ | 4.2 | ⚠️ RPC 请求用 create_task 而非 await | 🔴 致命 | 避免死锁!这是最常见的严重 bug |
68
+ | 4.3 | 事件通知用 create_task | 🟡 警告 | 避免阻塞接收循环 |
69
+ | 4.4 | RPC 响应可以同步处理 | 🟢 信息 | 只是 resolve future |
70
+
71
+ ---
72
+
73
+ ## 五、server.py RPC 处理
74
+
75
+ | # | 检查项 | 严重度 | 说明 |
76
+ |---|--------|--------|------|
77
+ | 5.1 | _rpc_call 正确生成 UUID id | 🔴 致命 | 用 `str(uuid.uuid4())` |
78
+ | 5.2 | _rpc_call 有超时机制 | 🟡 警告 | 默认 3 秒 |
79
+ | 5.3 | 超时后 pop pending_rpc | 🟡 警告 | 防止内存泄漏 |
80
+ | 5.4 | fire-and-forget 用 wait_response=False | 🟡 警告 | event.publish 不等响应 |
81
+ | 5.5 | RPC handler 去掉方法前缀 | 🟡 警告 | `my_module.health` → `health` |
82
+ | 5.6 | 未知方法返回 -32601 错误 | 🟡 警告 | 不能静默忽略 |
83
+ | 5.7 | handler 异常返回 -32603 错误 | 🟡 警告 | 包装 try-except |
84
+ | 5.8 | 实现 health 方法 | 🔴 致命 | 返回 status + uptime |
85
+ | 5.9 | 实现 status 方法 | 🟡 警告 | 返回模块状态信息 |
86
+
87
+ ---
88
+
89
+ ## 六、server.py 事件处理
90
+
91
+ | # | 检查项 | 严重度 | 说明 |
92
+ |---|--------|--------|------|
93
+ | 6.1 | 处理 system.require_init | 🔴 致命 | 触发 _do_init |
94
+ | 6.2 | 处理 system.ping → 回复 pong | 🟡 警告 | 不回复会被标记为不健康 |
95
+ | 6.3 | 处理 module.shutdown | 🟡 警告 | 触发优雅关闭 |
96
+ | 6.4 | _publish_event 格式正确 | 🔴 致命 | 包含 event_id + event + data |
97
+ | 6.5 | 事件名格式正确 | 🟡 警告 | `{module_name}.{event_type}` |
98
+ | 6.6 | event.subscribe 在 register 之前 | 🟡 警告 | 否则可能漏收事件 |
99
+
100
+ ---
101
+
102
+ ## 六b、健康检查(health RPC)
103
+
104
+ | # | 检查项 | 严重度 | 说明 |
105
+ |---|--------|--------|------|
106
+ | 6b.1 | health RPC 方法已注册 | 🔴 致命 | 在 handlers 分发表和 registry.register 中都要有 |
107
+ | 6b.2 | 响应包含 `healthy` 顶层字段 | 🔴 致命 | bool 类型,Watchdog 唯一判据 |
108
+ | 6b.3 | 响应包含 `framework` 字段 | 🟡 警告 | uptime, connections, pending_rpc, active_handlers, handler_capacity, pressure, memory_mb |
109
+ | 6b.4 | 响应包含 `business` 字段 | 🟡 警告 | healthy(bool) + message(string) + details(list) |
110
+ | 6b.5 | business.healthy 有实际判断逻辑 | 🟡 警告 | 不能永远返回 true,应检查关键业务资源 |
111
+ | 6b.6 | health handler 不做耗时操作 | 🟡 警告 | 只查状态不做计算,5 秒超时会被误判为不健康 |
112
+ | 6b.7 | framework.pressure 计算正确 | 🟢 建议 | idle/normal/overload/critical 四级 |
113
+ | 6b.8 | psutil 缺失时降级处理 | 🟢 建议 | memory_mb 用 try-except 包裹 |
114
+
115
+ ---
116
+
117
+ ## 七、优雅关闭
118
+
119
+ | # | 检查项 | 严重度 | 说明 |
120
+ |---|--------|--------|------|
121
+ | 7.1 | 设置 _shutting_down 标志 | 🟡 警告 | 阻止后续操作 |
122
+ | 7.2 | 发送 shutdown.ack | 🟡 警告 | 含 estimated_cleanup |
123
+ | 7.3 | 发送 module.exiting | 🟡 警告 | 含 action |
124
+ | 7.4 | 发送 shutdown.ready | 🟡 警告 | 清理完成通知 |
125
+ | 7.5 | sleep(0.01) 后再关连接 | 🟢 建议 | 给 Kernel 处理时间 |
126
+ | 7.6 | 先关附加连接再关主连接 | 🟡 警告 | 顺序不能反 |
127
+
128
+ ---
129
+
130
+ ## 八、多连接(如勾选)
131
+
132
+ | # | 检查项 | 严重度 | 说明 |
133
+ |---|--------|--------|------|
134
+ | 8.1 | 处理 system.connection.offer | 🔴 致命 | 接受 slot token |
135
+ | 8.2 | 使用 slot token 认证 | 🔴 致命 | 不是主 token |
136
+ | 8.3 | 附加连接有独立接收循环 | 🔴 致命 | 消息处理逻辑相同 |
137
+ | 8.4 | 处理 system.connection.release | 🟡 警告 | 释放连接 |
138
+ | 8.5 | _extra_ws 和 _extra_ws_tasks 管理 | 🟡 警告 | 断开时清理 |
139
+ | 8.6 | 关闭时先关附加连接 | 🟡 警告 | 在 shutdown 序列中 |
140
+
141
+ ---
142
+
143
+ ## 九、HTTP 服务(如勾选)
144
+
145
+ | # | 检查项 | 严重度 | 说明 |
146
+ |---|--------|--------|------|
147
+ | 9.1 | FastAPI app 在 startup 中启动 WS 客户端 | 🔴 致命 | 用 create_task |
148
+ | 9.2 | 端口绑定策略正确 | 🟡 警告 | preferred → +1 → +2 → OS |
149
+ | 9.3 | uvicorn log_level 设为 warning | 🟢 建议 | 减少噪音 |
150
+ | 9.4 | 注册时包含 port 和 base_url | 🟡 警告 | 其他模块需要知道 HTTP 地址 |
151
+ | 9.5 | /health 端点存在 | 🟡 警告 | Watchdog 健康检查用 |
152
+ | 9.6 | 静态文件挂载在所有路由之后 | 🟡 警告 | 否则会覆盖 API 路由 |
153
+
154
+ ---
155
+
156
+ ## 十、测试中心接入(如勾选前端页面)
157
+
158
+ | # | 检查项 | 严重度 | 说明 |
159
+ |---|--------|--------|------|
160
+ | 10.1 | 测试文件存在 | 🔴 致命 | `tests/modules/{name}.js` |
161
+ | 10.2 | 函数名与 window 注册一致 | 🔴 致命 | `testXxxModule` |
162
+ | 10.3 | 映射表已更新 | 🔴 致命 | index.js 中 MODULE_TESTS |
163
+ | 10.4 | script 标签已添加 | 🔴 致命 | 在 index.js 之前 |
164
+ | 10.5 | 下拉选项已添加 | 🔴 致命 | `#test-module-select` |
165
+ | 10.6 | 函数是 async | 🟡 警告 | 同步函数会挂起 |
166
+ | 10.7 | 末尾有 runner.log('') | 🟢 建议 | 格式一致性 |
167
+
168
+ ---
169
+
170
+ ## 十一、日志规范
171
+
172
+ | # | 检查项 | 严重度 | 说明 |
173
+ |---|--------|--------|------|
174
+ | 11.1 | latest.log 每次启动清空 | 🟡 警告 | 只含本次运行内容 |
175
+ | 11.2 | daily log 按 YYYY-MM/YYYY-MM-DD.log 归档 | 🟢 建议 | 便于历史查看 |
176
+ | 11.3 | crashes.jsonl 含完整信息 | 🟡 警告 | timestamp, module, traceback, platform |
177
+ | 11.4 | crashes 有 daily 归档 | 🟢 建议 | crashes/YYYY-MM/YYYY-MM-DD.jsonl |
178
+ | 11.5 | 多实例日志带后缀 | 🟡 警告 | latest~2.log(实例 > 1 时) |
179
+
180
+ ---
181
+
182
+ ## 十二、启动时间优化
183
+
184
+ 模块从进程启动到发布 `module.ready` 的完整路径,每一步都有优化空间。
185
+
186
+ ### 启动关键路径
187
+
188
+ ```
189
+ 进程启动
190
+ ↓ ① 模块级 import(Python 模块加载)
191
+ ↓ ② _load_module_config()(读 module.md YAML)
192
+ ↓ ③ _SafeWriter + logging 设置
193
+ ↓ ④ Server 类 import(⚠️ 最大瓶颈)
194
+ ↓ ⑤ stdin.readline()(阻塞等 Launcher 发 boot_info)
195
+ ↓ ⑥ Server 实例化
196
+ ↓ ⑦ asyncio.run / uvicorn.run
197
+ ↓ ⑧ WebSocket 连接 + auth
198
+ ↓ ⑨ 等待 system.require_init
199
+ ↓ ⑩ _do_init: subscribe → register → ready
200
+ ```
201
+
202
+ Launcher 视角:**从发出 boot_info 到收到 `module.ready` 事件** = 模块启动时长。
203
+ 但 ①~④ 发生在 stdin 读取之前,Launcher 还没发 boot_info 模块就已经在消耗时间了。
204
+
205
+ ### 检查项
206
+
207
+ | # | 检查项 | 严重度 | 说明 |
208
+ |---|--------|--------|------|
209
+ | 12.1 | ⚠️ Server 类 import 在 stdin 读取之后 | 🔴 性能 | 最大优化点。在 stdin 之前 import 会阻塞 Launcher 启动流水线。现有模块实测:dataclaw ~300-500ms,web ~200-300ms,acp_channel ~50-100ms。audit 是正确范例(import 在 `_run_local_mode` 内) |
210
+ | 12.2 | 第三方库延迟导入 | 🟡 性能 | FastAPI、uvicorn、websockets 等重型库应随 Server 类一起延迟,不要在文件顶部 import |
211
+ | 12.3 | _do_init 中 subscribe 和 register 并行 | 🟡 性能 | 用 `asyncio.gather(subscribe, register)` 替代顺序 await,可节省 50-100ms |
212
+ | 12.4 | Server.__init__ 不做耗时操作 | 🟡 性能 | 构造函数只存参数。数据库连接、文件加载等放到 `_do_init` 或 startup 事件中 |
213
+ | 12.5 | HTTP 路由延迟注册或懒加载 | 🟢 性能 | 路由多的服务(如 dataclaw 12 个 router),可考虑在 `_create_app()` 中按需加载而非全量 import |
214
+ | 12.6 | 端口绑定在 stdin 之后 | 🟢 性能 | 端口绑定本身很快(~10ms),但确保不在关键路径上阻塞 |
215
+ | 12.7 | 业务初始化异步化 | 🟡 性能 | 数据加载、缓存预热等放在 `asyncio.create_task()` 中,不阻塞 `module.ready` |
216
+ | 12.8 | module.ready 尽早发布 | 🟡 性能 | ready 表示"可以接受请求",不是"所有数据都加载完"。先 ready,后台继续初始化 |
217
+ | 12.9 | 并行 import + stdin 读取 | 🟢 性能 | 后台线程 import 重型库,主线程同时等 stdin。两步重叠,总时间 = max(import, stdin) |
218
+ | 12.10 | HTTP 端口预绑定复用 | 🟢 性能 | 先 `socket.bind()` 再传给 uvicorn `sockets=[sock]`,避免 uvicorn 重复绑端口。Kernel 已实现此模式 |
219
+
220
+ ### 现有最优范例
221
+
222
+ **Kernel(最优)**:延迟导入 uvicorn 和 KernelServer,先绑端口先输出,再 import 再创建 server。
223
+ **Evol(后台并行)**:daemon 线程跑前端构建,不阻塞 uvicorn 启动。
224
+ **Audit(正确)**:Server import 在 `_run_local_mode()` 函数内部,stdin 之后。
225
+
226
+ ### 终极启动模式(import 与 stdin 并行)
227
+
228
+ ```python
229
+ import threading
230
+
231
+ _server_cls = [None]
232
+ def _bg_import():
233
+ from my_module.server import MyServer
234
+ _server_cls[0] = MyServer
235
+
236
+ # 后台 import(不阻塞主线程)
237
+ t = threading.Thread(target=_bg_import, daemon=True)
238
+ t.start()
239
+
240
+ # 主线程同时读 stdin(两件事并行!)
241
+ line = sys.stdin.readline().strip()
242
+ msg = json.loads(line)
243
+ token = msg["token"]
244
+
245
+ # 等后台 import 完成(如果 stdin 比 import 快,这里等一下;反之 import 已完成)
246
+ t.join(timeout=10)
247
+ MyServer = _server_cls[0]
248
+ server = MyServer(token=token, ...)
249
+ ```
250
+
251
+ ### 标准启动顺序(优化版)
252
+
253
+ ```python
254
+ # ── entry.py ──
255
+
256
+ # ① 只 import 标准库(轻量)
257
+ import asyncio, json, os, sys, time ...
258
+
259
+ # ② 加载 module.md 配置(~10-50ms,可接受)
260
+ _module_config = _load_module_config()
261
+
262
+ # ③ 设置 _SafeWriter + logging(~5ms)
263
+ sys.stdout = _SafeWriter(sys.stdout)
264
+ builtins.print = _tprint
265
+
266
+ # ④ 不要在这里 import Server 类!
267
+
268
+ def _run_local_mode(kernel_port):
269
+ # ⑤ 先设置日志 + 异常 hook
270
+ _setup_exception_hooks()
271
+
272
+ # ⑥ 读 stdin(Launcher 发 boot_info)
273
+ line = sys.stdin.readline().strip()
274
+ msg = json.loads(line)
275
+ token = msg["token"]
276
+
277
+ # ⑦ 读完 stdin 后再 import Server 类(重型依赖在这里加载)
278
+ from my_module.server import MyServer
279
+
280
+ # ⑧ 实例化并启动
281
+ server = MyServer(token=token, kernel_port=kernel_port, ...)
282
+ asyncio.run(server.run())
283
+ ```
284
+
285
+ ```python
286
+ # ── server.py _do_init ──
287
+
288
+ async def _do_init(self, ws):
289
+ # subscribe 和 register 可以并行
290
+ await asyncio.gather(
291
+ self._rpc_call(ws, "event.subscribe", {"events": [...]}),
292
+ self._rpc_call(ws, "registry.register", {
293
+ "module_id": self._module_name, ...
294
+ }),
295
+ )
296
+ # ready 必须在 register 之后
297
+ await self._publish_event(ws, "module.ready", {"module_id": self._module_name})
298
+
299
+ # 业务初始化放后台,不阻塞 ready
300
+ asyncio.create_task(self._deferred_business_init())
301
+ ```
302
+
303
+ ### 现有模块启动时间评估
304
+
305
+ | 模块 | import 位置 | import 耗时 | 评级 |
306
+ |------|-------------|-------------|------|
307
+ | audit | stdin 之后 ✅ | 0ms(不在关键路径上) | 最优 |
308
+ | acp_channel | stdin 之前 ❌ | ~50-100ms | 需优化 |
309
+ | web | stdin 之前 ❌ | ~200-300ms | 需优化 |
310
+ | dataclaw | 文件顶部 ❌❌ | ~300-500ms | 最差 |
311
+
312
+ ### 优化效果预估
313
+
314
+ | 指标 | 优化前 | 优化后 | 提升 |
315
+ |------|--------|--------|------|
316
+ | 全量启动(所有模块 ready) | ~1100ms | ~300ms | **73%** |
317
+ | 单模块 ready(从收到 boot_info) | ~200-300ms | ~100-150ms | **50%** |
318
+
319
+ ---
320
+
321
+ ## 十三、退出时间优化
322
+
323
+ ### 退出关键路径
324
+
325
+ ```
326
+ Kernel 发布 module.shutdown
327
+ ↓ ① 模块收到事件
328
+ ↓ ② 发布 shutdown.ack
329
+ ↓ ③ 发布 module.exiting
330
+ ↓ ④ 执行清理(关闭资源、保存状态)
331
+ ↓ ⑤ 发布 shutdown.ready
332
+ ↓ ⑥ 关闭附加连接
333
+ ↓ ⑦ 关闭主连接
334
+ ↓ ⑧ 进程退出
335
+ ```
336
+
337
+ Launcher 有三级超时:ack 超时 3s → exiting 超时 3s → 强制终止。
338
+ **实际清理通常只需 50-100ms**,但如果模块卡住,会等满超时。
339
+
340
+ ### 检查项
341
+
342
+ | # | 检查项 | 严重度 | 说明 |
343
+ |---|--------|--------|------|
344
+ | 13.1 | shutdown.ack 立即发送 | 🟡 性能 | 收到 shutdown 后第一件事就是发 ack,不要先做清理再 ack |
345
+ | 13.2 | 清理操作有超时保护 | 🟡 性能 | 单个清理操作不应超过 2 秒,否则用 `asyncio.wait_for` 包裹 |
346
+ | 13.3 | 可并行的清理操作用 gather | 🟢 性能 | 多个独立资源(数据库连接、文件句柄、外部连接)可并行关闭 |
347
+ | 13.4 | 附加连接并行关闭 | 🟢 性能 | 多个 slot 的 `ws.close()` 可以用 `asyncio.gather` |
348
+ | 13.5 | _shutting_down 标志立即设置 | 🟡 性能 | 阻止测试事件循环和新 RPC 处理,避免关闭过程中产生新操作 |
349
+ | 13.6 | 长任务支持取消 | 🟢 性能 | 正在执行的长任务应检查 `_shutting_down`,及早退出 |
350
+ | 13.7 | HTTP 服务关闭不阻塞 | 🟡 性能 | uvicorn `should_exit = True` 后不要 await 额外操作 |
351
+
352
+ ### 优化版退出序列
353
+
354
+ ```python
355
+ async def _handle_shutdown(self, ws):
356
+ self._shutting_down = True # 立即设置!
357
+
358
+ # ack 立即发送,不做任何清理
359
+ await self._publish_event(ws, "module.shutdown.ack", {
360
+ "module_id": self._module_name, "estimated_cleanup": 1,
361
+ })
362
+
363
+ # 清理操作并行执行
364
+ cleanup_tasks = []
365
+ if self._db_conn:
366
+ cleanup_tasks.append(self._db_conn.close())
367
+ if self._cache:
368
+ cleanup_tasks.append(self._cache.flush())
369
+ if cleanup_tasks:
370
+ await asyncio.gather(*cleanup_tasks, return_exceptions=True)
371
+
372
+ await self._publish_event(ws, "module.exiting", {
373
+ "module_id": self._module_name, "action": "cleanup_done",
374
+ })
375
+
376
+ await self._publish_event(ws, "module.shutdown.ready", {
377
+ "module_id": self._module_name,
378
+ })
379
+ await asyncio.sleep(0.01)
380
+
381
+ # 附加连接并行关闭
382
+ close_tasks = [w.close(code=1000, reason="shutdown") for w in self._extra_ws.values()]
383
+ if close_tasks:
384
+ await asyncio.gather(*close_tasks, return_exceptions=True)
385
+ self._extra_ws.clear()
386
+
387
+ await ws.close(code=1000, reason="Graceful shutdown")
388
+
389
+ if self._uvicorn_server:
390
+ self._uvicorn_server.should_exit = True
391
+ ```
392
+
393
+ ---
394
+
395
+ ## 十四、跨平台兼容性(Windows / Linux / macOS)
396
+
397
+ Kite 框架核心原则:所有功能必须在三个平台上可用。
398
+
399
+ | # | 检查项 | 严重度 | 说明 |
400
+ |---|--------|--------|------|
401
+ | 14.1 | 文件路径使用 `os.path.join` 或 `pathlib` | 🔴 致命 | 禁止硬编码 `/` 或 `\\` |
402
+ | 14.2 | 不依赖平台特有命令 | 🔴 致命 | 禁止直接调用 `tasklist`/`ps`/`wmic` 等。如必须,提供多策略降级 |
403
+ | 14.3 | 进程信号处理兼容 | 🟡 警告 | Windows 不支持 SIGKILL/SIGUSR1。只用 SIGTERM + SIGINT,终止用 `process.terminate()` |
404
+ | 14.4 | 文件编码显式指定 | 🟡 警告 | `open(f, encoding="utf-8")`,不依赖系统默认编码(Windows 可能是 GBK) |
405
+ | 14.5 | 临时文件路径安全 | 🟡 警告 | 用 `tempfile.gettempdir()` 而非硬编码 `/tmp` |
406
+ | 14.6 | Home 目录获取兼容 | 🟡 警告 | `os.environ.get("HOME") or os.environ.get("USERPROFILE") or os.path.expanduser("~")` |
407
+ | 14.7 | 端口绑定地址 | 🟢 建议 | 不要用 `localhost`(某些平台解析为 IPv6),用 `127.0.0.1` 或 `0.0.0.0` |
408
+ | 14.8 | 子进程创建方式 | 🟡 警告 | 用 `subprocess.Popen` 而非 `os.system`。Windows 下 `shell=True` 行为不同 |
409
+ | 14.9 | 文件锁机制 | 🟡 警告 | 不能用 `fcntl.flock`(Unix only)。跨平台方案:原子写 + 临时文件重命名,或 `filelock` 库 |
410
+ | 14.10 | 换行符处理 | 🟢 建议 | JSON/JSONL 输出不受影响,文本文件用 `newline=""` 参数控制 |
411
+ | 14.11 | 环境变量分隔符 | 🟢 建议 | PATH 分隔符用 `os.pathsep`(Windows `;`,Unix `:`) |
412
+ | 14.12 | Windows WinError 处理 | 🟡 警告 | `ConnectionRefusedError` 在 Windows 有时表现为 `OSError(WinError 1225)`,需要额外捕获 |
413
+
414
+ ### 常见平台差异速查
415
+
416
+ | 操作 | Windows | Linux/macOS | 跨平台方案 |
417
+ |------|---------|-------------|-----------|
418
+ | 路径分隔符 | `\` | `/` | `os.path.join()` |
419
+ | Home 目录 | `%USERPROFILE%` | `$HOME` | `os.path.expanduser("~")` |
420
+ | 临时目录 | `%TEMP%` | `/tmp` | `tempfile.gettempdir()` |
421
+ | 进程终止 | `taskkill` | `kill` | `process.terminate()` |
422
+ | 文件编码 | GBK/CP936 | UTF-8 | 显式 `encoding="utf-8"` |
423
+ | 信号 | 仅 SIGTERM/SIGINT | 全部 | 只用 SIGTERM |
424
+ | 连接拒绝 | WinError 1225 | ECONNREFUSED | 双重 catch |
425
+
426
+ ---
427
+
428
+ ## 十五、跨语言兼容性(Python / Node.js / Binary)
429
+
430
+ Kite 框架核心原则:模块间通信仅使用语言无关协议。
431
+
432
+ | # | 检查项 | 严重度 | 说明 |
433
+ |---|--------|--------|------|
434
+ | 15.1 | 模块间通信仅用 JSON-RPC 2.0 | 🔴 致命 | WebSocket 消息必须是标准 JSON。不能用 pickle、msgpack 等语言特定序列化 |
435
+ | 15.2 | stdin boot_info 是纯 JSON | 🔴 致命 | 一行 JSON 文本,不能有语言特定格式 |
436
+ | 15.3 | 事件数据是 JSON 可序列化的 | 🔴 致命 | data 只能包含 string/number/bool/null/array/object。不能传 datetime、bytes |
437
+ | 15.4 | RPC 参数和返回值 JSON 可序列化 | 🔴 致命 | Python `None` → `null`,`True` → `true`,不能传自定义对象 |
438
+ | 15.5 | 不依赖语言特有 IPC 机制 | 🔴 致命 | 禁止 Python multiprocessing.Queue、Node IPC channel 等 |
439
+ | 15.6 | 时间戳用 Unix timestamp 或 ISO 8601 | 🟡 警告 | `time.time()`(浮点秒)或 `datetime.isoformat()`。不用语言特定时间对象 |
440
+ | 15.7 | 日志格式语言无关 | 🟡 警告 | latest.log 纯文本,crashes.jsonl 标准 JSON Lines |
441
+ | 15.8 | 配置文件格式通用 | 🟡 警告 | module.md(YAML)、config.json5(JSON5)。不用 Python .ini 或 Node .env |
442
+ | 15.9 | 进程管理一视同仁 | 🟡 警告 | Launcher 对 python/node/binary 三种 runtime 使用相同机制 |
443
+
444
+ ---
445
+
446
+ ## 十六、模块独立性(零共享代码依赖)
447
+
448
+ Kite 框架最高设计原则:模块间不可有任何代码级依赖。
449
+
450
+ | # | 检查项 | 严重度 | 说明 |
451
+ |---|--------|--------|------|
452
+ | 16.1 | 不 import 其他模块的代码 | 🔴 致命 | 禁止 `from extensions.services.web.xxx import yyy` |
453
+ | 16.2 | 不 import core/ 共享库(或标注为可选) | 🟡 警告 | `core/kite_log.py` 是便利库不是强制依赖。删除 core/ 后模块仍须运行 |
454
+ | 16.3 | 不使用跨模块共享函数或类 | 🔴 致命 | 禁止继承、mixin、trait 等任何形式的代码复用 |
455
+ | 16.4 | 不依赖共享配置文件 | 🟡 警告 | 环境变量可以,共享 config 文件不行 |
456
+ | 16.5 | 模块可独立部署运行 | 🔴 致命 | 单独拷贝模块目录 + 装依赖后,能连任意 Kernel |
457
+ | 16.6 | 模块可用其他语言重写 | 🟢 设计 | 只要遵循相同通信协议,Python 模块可被 Node/Go 替换 |
458
+ | 16.7 | 共享只通过约定 | 🟢 设计 | 允许:环境变量、文件路径约定、文件格式约定、网络协议、事件协议 |
459
+
460
+ ### 违规检测命令
461
+
462
+ ```bash
463
+ # 检查是否 import 了其他 extensions 模块
464
+ grep -r "from extensions\." extensions/{module_name}/ --include="*.py" | grep -v __pycache__
465
+
466
+ # 检查是否 import 了 core/(kite_log 除外需标注可选)
467
+ grep -r "from core\." extensions/{module_name}/ --include="*.py" | grep -v __pycache__
468
+
469
+ # 检查是否 import 了 kernel/ 或 launcher/
470
+ grep -r "from kernel\.\|from launcher\." extensions/{module_name}/ --include="*.py" | grep -v __pycache__
471
+ ```
472
+
473
+ **任何一条有输出(除 core/kite_log.py 外)→ 模块独立性不合格。**
474
+
475
+ ### 正确的跨模块交互方式
476
+
477
+ | 需求 | 错误做法 ❌ | 正确做法 ✅ |
478
+ |------|-----------|-----------|
479
+ | 调用其他模块功能 | `from web.server import WebServer` | `await _rpc_call(ws, "web.method", {})` |
480
+ | 读取其他模块数据 | 直接读对方文件 | 通过 RPC 请求数据 |
481
+ | 共享工具函数 | 放 `core/utils.py` 让大家 import | 各模块独立实现 |
482
+ | 共享配置 | 读同一个 config 文件 | 各自 module.md + 环境变量 |
483
+ | 共享类型定义 | 共享 Pydantic model | JSON schema 约定,各自解析 |
484
+
485
+ ---
486
+
487
+ ## 审查评分规则
488
+
489
+ - 🔴 致命:不修复则模块无法正常运行
490
+ - 🟡 警告:不修复可能导致异常行为或调试困难
491
+ - 🟢 建议:最佳实践,不影响功能
492
+
493
+ **审查评分:**
494
+ - 🔴 0 个 + 🟡 ≤ 2 个 → ✅ 合格
495
+ - 🔴 0 个 + 🟡 3-5 个 → ⚠️ 需改进
496
+ - 🔴 ≥ 1 个 → ❌ 不合格
@@ -0,0 +1,180 @@
1
+ # 事件订阅/发布标准模式
2
+
3
+ ## 事件消息格式
4
+
5
+ 事件通过 JSON-RPC 2.0 通知(无 id)传递:
6
+
7
+ ```json
8
+ {
9
+ "jsonrpc": "2.0",
10
+ "method": "event",
11
+ "params": {
12
+ "event": "module.ready",
13
+ "source": "web",
14
+ "data": {"module_id": "web"},
15
+ "event_id": "uuid",
16
+ "seq": 5,
17
+ "session_id": "session-uuid"
18
+ }
19
+ }
20
+ ```
21
+
22
+ ## 事件订阅
23
+
24
+ ### 订阅 RPC
25
+
26
+ ```python
27
+ await self._rpc_call(ws, "event.subscribe", {
28
+ "events": [
29
+ "module.started",
30
+ "module.stopped",
31
+ "module.shutdown",
32
+ "system.ping",
33
+ ]
34
+ })
35
+ ```
36
+
37
+ ### 通配符订阅
38
+
39
+ | 模式 | 匹配 | 示例 |
40
+ |------|------|------|
41
+ | `module.*` | module 下所有事件 | module.started, module.stopped |
42
+ | `*.started` | 所有 started 事件 | module.started, system.started |
43
+ | `>` | 所有事件(慎用) | 一切 |
44
+
45
+ ## 事件发布
46
+
47
+ ### 标准 _publish_event 实现
48
+
49
+ ```python
50
+ async def _publish_event(self, ws, event: str, data: dict = None):
51
+ """发布事件(fire-and-forget,不等响应)。"""
52
+ await self._rpc_call(ws, "event.publish", {
53
+ "event_id": str(uuid.uuid4()),
54
+ "event": event,
55
+ "data": data or {},
56
+ }, wait_response=False)
57
+ ```
58
+
59
+ **关键:`wait_response=False`** — 事件发布不需要等响应,否则会积压 pending_rpc。
60
+
61
+ ## 事件通知处理
62
+
63
+ ### 标准 _handle_event_notification 实现
64
+
65
+ ```python
66
+ async def _handle_event_notification(self, msg: dict):
67
+ params = msg.get("params", {})
68
+ event_type = params.get("event", "")
69
+ data = params.get("data", {})
70
+
71
+ # ── 第 1 层:系统事件(必须处理) ──
72
+ if event_type == "system.require_init":
73
+ asyncio.create_task(self._do_init(self._ws))
74
+ return
75
+
76
+ if event_type == "system.ping":
77
+ await self._handle_ping(data)
78
+ return
79
+
80
+ if event_type == "system.connection.offer":
81
+ asyncio.create_task(self._handle_connection_offer(data))
82
+ return
83
+
84
+ if event_type == "system.connection.release":
85
+ asyncio.create_task(self._handle_connection_release(data))
86
+ return
87
+
88
+ if event_type == "module.shutdown":
89
+ await self._handle_shutdown(self._ws)
90
+ return
91
+
92
+ # ── 第 2 层:忽略系统广播事件(不需要处理) ──
93
+ IGNORE_EVENTS = {
94
+ "module.ready", "module.registered", "module.started",
95
+ "module.stopped", "module.crashed", "module.exiting",
96
+ "module.offline", "module.shutdown.ack", "module.shutdown.ready",
97
+ "system.ready", "registry.updated",
98
+ "system.instance.started", "system.instance.stopped",
99
+ }
100
+ if event_type in IGNORE_EVENTS:
101
+ return
102
+
103
+ # ── 第 3 层:模块自定义事件 ──
104
+ # 在这里处理你的业务事件
105
+ print(f"[EVENT] 收到: {event_type}")
106
+ ```
107
+
108
+ ### ⚠️ 事件处理的关键规则
109
+
110
+ 1. **system.require_init 必须用 create_task** — 因为 _do_init 内部会调用 _rpc_call,如果 await 会阻塞接收循环
111
+ 2. **system.connection.offer 必须用 create_task** — 因为需要建立新的 WebSocket 连接
112
+ 3. **module.shutdown 可以 await** — 因为处理完就要关闭了,不需要继续接收
113
+ 4. **system.ping 可以 await** — 因为只是发一个 pong,很快
114
+
115
+ ## Ping/Pong 机制
116
+
117
+ Kernel 定期发送 `system.ping`,模块必须回复 `system.pong`:
118
+
119
+ ```python
120
+ async def _handle_ping(self, data: dict):
121
+ t1 = data.get("ping_time")
122
+ t2 = time.time()
123
+ await self._publish_event(self._ws, "system.pong", {
124
+ "module_id": self._module_name,
125
+ "ping_time": t1,
126
+ "pong_time": t2,
127
+ })
128
+ ```
129
+
130
+ **不回复 pong 的后果:** Kernel 会记录 timeout,连续多次 timeout 后可能标记模块为不健康。
131
+
132
+ ## 测试事件循环
133
+
134
+ 很多模块实现了定时发布测试事件的循环,用于验证事件系统正常工作:
135
+
136
+ ```python
137
+ async def _test_event_loop(self):
138
+ """每 12 秒发布测试事件,同时报告压力等级。"""
139
+ while not self._shutting_down:
140
+ await asyncio.sleep(12)
141
+ if self._shutting_down:
142
+ break
143
+ if self._ws:
144
+ await self._publish_event(self._ws, f"{self._module_name}.test", {
145
+ "timestamp": time.time(),
146
+ "message": "periodic test",
147
+ })
148
+ ```
149
+
150
+ ## 压力报告事件
151
+
152
+ 支持弹性伸缩的模块需要定期报告压力等级:
153
+
154
+ ```python
155
+ def _compute_pressure_level(self) -> str:
156
+ depth = self._active_handlers + len(self._pending_rpc)
157
+ ratio = depth / self._handler_capacity if self._handler_capacity > 0 else 0
158
+ if ratio >= 0.9:
159
+ return "critical"
160
+ elif ratio >= 0.5:
161
+ return "overload"
162
+ elif depth > 0:
163
+ return "normal"
164
+ return "idle"
165
+
166
+ # 在测试事件循环中一起报告
167
+ await self._publish_event(self._ws, "module.queue_pressure", {
168
+ "level": self._compute_pressure_level(),
169
+ "depth": self._active_handlers + len(self._pending_rpc),
170
+ "capacity": self._handler_capacity,
171
+ })
172
+ ```
173
+
174
+ ## 常见坑
175
+
176
+ 1. **event.publish 不要 wait_response** — 设 `wait_response=False`,否则大量事件会积压 pending_rpc
177
+ 2. **event_id 必须唯一** — 用 `uuid.uuid4()`,重复的 event_id 会被 Kernel 静默去重
178
+ 3. **事件名命名** — 格式 `{module_name}.{event_type}`,如 `my_service.data_ready`
179
+ 4. **不要在事件 handler 中做耗时操作** — 会阻塞接收循环,用 create_task 异步处理
180
+ 5. **订阅要在 register 之前** — 否则可能漏收注册后立即到来的事件