@agentunion/kite 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (573) hide show
  1. package/.claude/skills/kite/checklists/feature-checklist.md +496 -0
  2. package/.claude/skills/kite/references/event-patterns.md +180 -0
  3. package/.claude/skills/kite/references/health-check.md +202 -0
  4. package/.claude/skills/kite/references/http-service.md +199 -0
  5. package/.claude/skills/kite/references/module-md-spec.md +172 -0
  6. package/.claude/skills/kite/references/multi-connection.md +147 -0
  7. package/.claude/skills/kite/references/rpc-patterns.md +199 -0
  8. package/.claude/skills/kite/references/shutdown-sequence.md +146 -0
  9. package/.claude/skills/kite/references/stdin-protocol.md +147 -0
  10. package/.claude/skills/kite/references/test-center-integration.md +178 -0
  11. package/.claude/skills/kite/references/ws-lifecycle.md +301 -0
  12. package/.claude/skills/kite/skill.md +272 -0
  13. package/.claude/skills/kite/templates/go/README.md +20 -0
  14. package/.claude/skills/kite/templates/node/entry.js +134 -0
  15. package/.claude/skills/kite/templates/node/module.md +16 -0
  16. package/.claude/skills/kite/templates/node/server.js +351 -0
  17. package/.claude/skills/kite/templates/node/server_http.js +90 -0
  18. package/.claude/skills/kite/templates/python/entry.py +425 -0
  19. package/.claude/skills/kite/templates/python/module.md +26 -0
  20. package/.claude/skills/kite/templates/python/server.py +447 -0
  21. package/.claude/skills/kite/templates/python/server_http.py +433 -0
  22. package/cli.js +38 -4
  23. package/core/env_checker.py +96 -0
  24. package/docs/05-/347/237/255/344/277/241/350/256/244/350/257/201/344/270/216/347/224/250/346/210/267/344/277/241/346/201/257/346/216/245/345/217/243/346/226/207/346/241/243.md +507 -0
  25. package/docs/ACP/345/215/217/350/256/256/345/205/274/345/256/271/346/226/271/346/241/210.md +138 -0
  26. package/docs/CI/344/270/216AI/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/346/226/271/346/241/210.md +75 -0
  27. package/docs/CLI/345/274/200/345/217/221/350/256/241/345/210/222.md +595 -0
  28. package/docs/ClaudeCode/350/277/234/347/250/213/345/215/217/344/275/234/347/263/273/347/273/237-/346/212/200/346/234/257/350/257/204/344/274/260.md +535 -0
  29. package/docs/ClaudeCode/350/277/234/347/250/213/345/215/217/344/275/234/347/263/273/347/273/237/350/256/276/350/256/241.md +631 -0
  30. package/docs/Evol-App/344/275/277/347/224/250KernelClient/346/224/271/351/200/240/345/256/214/346/210/220.md +342 -0
  31. package/docs/Evol/346/216/247/345/210/266/345/217/260/346/217/222/344/273/266/345/214/226/346/236/266/346/236/204/346/246/202/350/246/201.md +604 -0
  32. package/docs/Evol/346/216/247/345/210/266/345/217/260/346/217/222/344/273/266/345/214/226/346/236/266/346/236/204/350/256/276/350/256/241.md +1708 -0
  33. package/docs/Evol/346/250/241/345/235/227/350/256/276/350/256/241/346/226/271/346/241/210.md +1154 -0
  34. package/docs/Evol/351/241/265/351/235/242/346/217/222/344/273/266/345/214/226-Evol/346/250/241/345/235/227/345/256/236/346/226/275/346/214/207/345/215/227.md +403 -0
  35. package/docs/Evol/351/241/265/351/235/242/346/217/222/344/273/266/345/214/226-/345/244/226/351/203/250/346/250/241/345/235/227/346/216/245/345/205/245/346/214/207/345/215/227.md +468 -0
  36. package/docs/HTTP-RPC/350/277/201/347/247/273/345/210/260WebSocket/350/256/241/345/210/222.md +318 -0
  37. package/docs/INDEX.md +388 -0
  38. package/docs/KITE_DOCS_GUIDE.md +33 -0
  39. package/docs/Kernel-Client-Kite-Token/346/224/257/346/214/201/345/256/236/346/226/275/345/256/214/346/210/220.md +330 -0
  40. package/docs/Kernel/344/270/273/345/212/250Ping/346/234/272/345/210/266-/346/255/243/347/241/256/345/256/236/347/216/260.md +235 -0
  41. package/docs/Kernel/344/270/273/345/212/250Ping/346/234/272/345/210/266/345/256/236/346/226/275/346/200/273/347/273/223.md +204 -0
  42. package/docs/Kite/345/256/211/350/243/205/351/227/256/351/242/230/350/247/243/345/206/263/346/226/271/346/241/210.md +362 -0
  43. package/docs/Kite/346/216/247/345/210/266/345/217/260/346/217/222/344/273/266/345/214/226/346/236/266/346/236/204/350/256/276/350/256/241-/347/273/210/346/236/201/347/233/256/346/240/207.md +721 -0
  44. package/docs/Kite/346/216/247/345/210/266/345/217/260/347/273/237/344/270/200WebSocket/346/224/271/351/200/240/346/226/271/346/241/210.md +821 -0
  45. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/01-/346/241/206/346/236/266/345/256/232/344/275/215.md +12 -0
  46. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/02-/346/240/270/345/277/203/346/246/202/345/277/265.md +341 -0
  47. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/03-/347/263/273/347/273/237/346/236/266/346/236/204.md +257 -0
  48. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/04-/346/250/241/345/235/227/350/247/204/350/214/203.md +263 -0
  49. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/05-/346/240/270/345/277/203/346/265/201/347/250/213-/346/226/260/347/211/210.md +267 -0
  50. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/05-/346/240/270/345/277/203/346/265/201/347/250/213.md +149 -0
  51. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/06-/347/233/256/345/275/225/347/273/223/346/236/204.md +231 -0
  52. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/07-/346/225/260/346/215/256/346/250/241/345/236/213.md +68 -0
  53. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/08-/346/211/251/345/261/225/346/200/247.md +34 -0
  54. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/09-/344/270/216/345/205/267/344/275/223/345/272/224/347/224/250/347/232/204/345/205/263/347/263/273.md +22 -0
  55. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/README.md +46 -0
  56. package/docs/Kite/347/263/273/347/273/237/345/220/257/345/212/250/346/265/201/347/250/213.md +567 -0
  57. package/docs/Launcher/345/220/257/345/212/250/345/231/250/346/226/207/346/241/243.md +745 -0
  58. package/docs/Polyglot/350/277/220/350/241/214/346/227/266/344/270/216Clawdbot/345/205/274/345/256/271/346/200/247/350/256/276/350/256/241.md +321 -0
  59. package/docs/Redis/344/270/216/346/250/241/345/235/227/345/244/232/345/256/236/344/276/213/346/226/271/346/241/210.md +438 -0
  60. package/docs/Relay-Kite-Token/350/256/244/350/257/201/345/256/236/346/226/275/345/256/214/346/210/220.md +178 -0
  61. package/docs/Relay-Token/346/235/203/351/231/220/351/205/215/347/275/256/351/252/214/350/257/201.md +113 -0
  62. package/docs/Watchdog/345/201/245/345/272/267/346/243/200/346/237/245/344/270/216WebSocket-Ping/346/234/272/345/210/266/345/210/206/346/236/220.md +367 -0
  63. package/docs/Watchdog/350/265/204/346/272/220/347/233/221/346/216/247/347/255/226/347/225/245.md +92 -0
  64. package/docs/WebSocket/346/216/245/346/224/266/345/276/252/347/216/257/346/255/273/351/224/201/351/230/262/350/214/203/350/247/204/350/214/203.md +357 -0
  65. package/docs/WebSocket/350/277/236/346/216/245/351/237/247/346/200/247/344/270/216/351/207/215/350/277/236/346/234/272/345/210/266/345/256/214/346/225/264/346/226/271/346/241/210.md +531 -0
  66. package/docs/WebSocket/350/277/236/346/216/245/351/237/247/346/200/247/346/226/271/346/241/210.md +169 -0
  67. package/docs/WebSocket/351/207/215/350/277/236/346/234/272/345/210/266/346/265/213/350/257/225/346/212/245/345/221/212.md +169 -0
  68. package/docs/WebSocket/351/207/215/350/277/236/351/200/200/351/201/277/346/234/272/345/210/266/346/226/271/346/241/210.md +394 -0
  69. package/docs/Web/346/250/241/345/235/227/344/270/216Evol/346/250/241/345/235/227/351/207/215/346/236/204/345/210/206/346/236/220.md +521 -0
  70. package/docs/audit-api-guide.md +68 -0
  71. package/docs/audit-module-design.md +315 -0
  72. package/docs/audit-module-implementation-summary.md +149 -0
  73. package/docs/llm-context-design.md +52 -0
  74. package/docs/llm-test-enhancement-plan.md +970 -0
  75. package/docs/logs-api-guide.md +42 -0
  76. package/docs/npm/345/214/205Python/347/216/257/345/242/203/347/256/241/347/220/206/346/226/271/346/241/210.md +302 -0
  77. package/docs/npm/345/217/221/345/270/203/344/270/216CLI/344/275/277/347/224/250/346/214/207/345/215/227.md +245 -0
  78. package/docs/stdio/344/270/216/347/253/257/345/217/243/345/217/221/347/216/260/351/207/215/346/236/204.md +480 -0
  79. package/docs/web/346/250/241/345/235/227/344/270/255/350/275/254/346/234/215/345/212/241/350/256/276/350/256/241/346/226/271/346/241/210.md +449 -0
  80. package/docs//344/272/213/344/273/266/345/244/204/347/220/206/346/234/272/345/210/266.md +388 -0
  81. package/docs//344/272/213/344/273/266/345/244/204/347/220/206/350/247/204/350/214/203.md +113 -0
  82. package/docs//344/272/213/344/273/266/350/256/242/351/230/205/351/200/232/351/205/215/347/254/246/350/247/204/350/214/203.md +256 -0
  83. package/docs//344/272/213/344/273/266/351/230/237/345/210/227/345/274/271/346/200/247/347/256/241/347/220/206.md +449 -0
  84. package/docs//344/272/244/344/272/222/345/274/217/347/273/210/347/253/257/346/216/247/345/210/266/346/226/271/346/241/210.md +301 -0
  85. package/docs//344/273/243/347/220/206/345/220/257/345/212/250/345/231/250/344/270/216/345/256/271/345/231/250/345/214/226.md +140 -0
  86. package/docs//344/273/243/347/240/201/347/273/237/350/256/241/345/267/245/345/205/267/344/275/277/347/224/250/350/257/264/346/230/216.md +217 -0
  87. package/docs//344/274/230/351/233/205/351/200/200/345/207/272/350/247/204/350/214/203.md +362 -0
  88. package/docs//344/276/235/350/265/226/347/256/241/347/220/206/350/257/264/346/230/216.md +141 -0
  89. package/docs//344/277/256/345/244/215/346/235/203/351/231/220/351/227/256/351/242/230-evol-RPC/346/235/203/351/231/220.md +268 -0
  90. package/docs//345/210/240/351/231/244kernel-client-example/345/256/214/346/210/220.md +309 -0
  91. package/docs//345/210/240/351/231/244ws-management/345/256/214/346/210/220.md +418 -0
  92. package/docs//345/220/257/345/212/250/344/274/230/345/214/226/346/226/271/346/241/210.md +522 -0
  93. package/docs//345/220/257/345/212/250/344/276/235/350/265/226/344/270/216/346/216/222/345/272/217.md +105 -0
  94. package/docs//345/256/211/350/243/205/350/204/232/346/234/254/345/274/200/345/217/221/346/226/207/346/241/243.md +643 -0
  95. package/docs//345/256/214/346/225/264/345/220/257/345/212/250/346/265/201/347/250/213/350/256/276/350/256/241.md +452 -0
  96. package/docs//345/256/236/347/216/260/350/247/204/345/210/222.md +195 -0
  97. package/docs//345/277/203/350/267/263/346/234/272/345/210/266/351/207/215/346/236/204/346/200/273/347/273/223.md +166 -0
  98. package/docs//346/217/241/346/211/213/350/256/244/350/257/201/346/226/271/346/241/210-/345/256/211/345/205/250/345/256/241/346/237/245.md +176 -0
  99. package/docs//346/217/241/346/211/213/350/256/244/350/257/201/346/226/271/346/241/210.md +908 -0
  100. package/docs//346/226/207/346/241/243/346/233/264/346/226/260/346/270/205/345/215/225.md +83 -0
  101. package/docs//346/227/245/345/277/227/344/270/216/345/274/202/345/270/270/345/244/204/347/220/206/350/247/204/350/214/203.md +829 -0
  102. package/docs//346/227/245/345/277/227/350/260/203/350/257/225/345/256/236/346/210/230/346/214/207/345/215/227.md +25 -0
  103. package/docs//346/236/266/346/236/204/345/200/237/351/211/264/346/214/207/345/215/227.md +977 -0
  104. package/docs//346/236/266/346/236/204/346/224/271/351/200/240-/345/256/214/346/210/220/346/200/273/347/273/223.md +440 -0
  105. package/docs//346/236/266/346/236/204/347/216/260/347/212/266/344/270/216/347/273/210/346/236/201/347/233/256/346/240/207/345/257/271/346/257/224/345/210/206/346/236/220.md +508 -0
  106. package/docs//346/250/241/345/235/227/345/244/232/350/277/236/346/216/245/346/216/247/345/210/266/347/255/226/347/225/245.md +220 -0
  107. package/docs//346/250/241/345/235/227/345/256/211/350/243/205/346/234/272/345/210/266/350/256/276/350/256/241.md +500 -0
  108. package/docs//346/250/241/345/235/227/345/274/200/345/217/221/346/214/207/345/215/227.md +1824 -0
  109. package/docs//346/250/241/345/235/227/347/203/255/346/233/264/346/226/260.md +89 -0
  110. package/docs//346/250/241/345/235/227/350/277/234/347/250/213/351/203/250/347/275/262/345/274/200/345/217/221/350/247/204/350/214/203.md +460 -0
  111. package/docs//346/250/241/345/235/227/351/200/200/345/207/272/346/234/272/345/210/266/345/256/214/346/225/264/346/226/271/346/241/210.md +303 -0
  112. package/docs//346/250/241/345/235/227/351/205/215/347/275/256/345/212/240/350/275/275/344/270/216/347/203/255/351/207/215/350/275/275/350/247/204/350/214/203.md +369 -0
  113. package/docs//346/265/213/350/257/225/344/270/255/345/277/203/346/267/273/345/212/240/346/250/241/345/235/227/346/265/213/350/257/225/346/214/207/345/215/227.md +147 -0
  114. package/docs//347/211/210/346/234/254/351/224/201/345/256/232/347/216/257/345/242/203/347/256/241/347/220/206/346/226/271/346/241/210.md +331 -0
  115. package/docs//347/216/257/345/242/203/345/217/230/351/207/217/344/270/216/350/277/220/350/241/214/346/227/266/347/233/256/345/275/225/350/256/276/350/256/241.md +499 -0
  116. package/docs//347/216/257/345/242/203/347/256/241/347/220/206/345/256/214/346/225/264/346/226/271/346/241/210.md +334 -0
  117. package/docs//350/231/232/346/213/237/346/250/241/345/235/227/344/270/255/350/275/254/346/234/215/345/212/241/345/256/214/346/225/264/350/256/276/350/256/241.md +1496 -0
  118. package/docs//350/231/232/346/213/237/347/216/257/345/242/203/345/267/245/344/275/234/345/216/237/347/220/206.md +163 -0
  119. package/docs//350/256/241/345/210/222/347/256/241/347/220/206/345/231/250/344/275/277/347/224/250/346/214/207/345/215/227.md +196 -0
  120. package/docs//350/256/244/350/257/201/346/250/241/345/235/227/344/270/216Gateway/350/256/276/350/256/241/346/226/271/346/241/210.md +765 -0
  121. package/docs//350/277/234/347/250/213/346/250/241/345/235/227/350/256/276/350/256/241-/346/227/247/347/211/210.md +1117 -0
  122. package/docs//350/277/234/347/250/213/346/250/241/345/235/227/350/256/276/350/256/241.md +451 -0
  123. package/docs//351/207/215/346/236/204/346/234/272/345/210/266/346/270/205/345/215/225.md +192 -0
  124. package/docs//351/223/276/350/267/257/350/277/275/350/270/252/346/226/271/346/241/210.md +242 -0
  125. package/docs//351/231/215/347/272/247/347/255/226/347/225/245/350/256/276/350/256/241/346/226/271/346/241/210.md +618 -0
  126. package/extensions/agents/assistant/entry.py +113 -14
  127. package/extensions/agents/assistant/module.md +27 -22
  128. package/extensions/agents/assistant/server.py +291 -105
  129. package/extensions/channels/acp_channel/entry.py +114 -16
  130. package/extensions/channels/acp_channel/module.md +4 -0
  131. package/extensions/channels/acp_channel/server.py +396 -105
  132. package/extensions/channels/phone_channel/__init__.py +1 -0
  133. package/extensions/channels/phone_channel/entry.py +503 -0
  134. package/extensions/channels/phone_channel/module.md +31 -0
  135. package/extensions/channels/phone_channel/server.py +686 -0
  136. package/extensions/event_hub_bench/entry.py +55 -12
  137. package/extensions/event_hub_bench/module.md +27 -27
  138. package/extensions/services/audit/README.md +134 -0
  139. package/extensions/services/audit/collector.py +73 -0
  140. package/extensions/services/audit/entry.py +444 -0
  141. package/extensions/services/audit/module.md +66 -0
  142. package/extensions/services/audit/query_audit.py +111 -0
  143. package/extensions/services/audit/routes/__init__.py +1 -0
  144. package/extensions/services/audit/routes/routes_audit.py +113 -0
  145. package/extensions/services/audit/schemas/__init__.py +5 -0
  146. package/extensions/services/audit/schemas/audit_event.py +92 -0
  147. package/extensions/services/audit/server.py +542 -0
  148. package/extensions/services/audit/storage.py +95 -0
  149. package/extensions/services/auth/entry.py +1054 -0
  150. package/extensions/services/auth/module.md +31 -0
  151. package/extensions/services/auth/token_store.py +185 -0
  152. package/extensions/services/auth/verifiers/evol_account.py +101 -0
  153. package/extensions/services/auth/verifiers/kite_token.py +38 -0
  154. package/extensions/services/auth/verifiers/pairing_code.py +71 -0
  155. package/extensions/services/backup/entry.py +494 -197
  156. package/extensions/services/backup/module.md +4 -2
  157. package/extensions/services/dataclaw/api/__init__.py +0 -0
  158. package/extensions/services/dataclaw/api/admin.py +367 -0
  159. package/extensions/services/dataclaw/api/copyright.py +175 -0
  160. package/extensions/services/dataclaw/api/credits.py +177 -0
  161. package/extensions/services/dataclaw/api/data.py +179 -0
  162. package/extensions/services/dataclaw/api/demands.py +269 -0
  163. package/extensions/services/dataclaw/api/feeds.py +262 -0
  164. package/extensions/services/dataclaw/api/identity.py +505 -0
  165. package/extensions/services/dataclaw/api/notifications.py +104 -0
  166. package/extensions/services/dataclaw/api/reviews.py +138 -0
  167. package/extensions/services/dataclaw/api/search.py +153 -0
  168. package/extensions/services/dataclaw/api/subscriptions.py +157 -0
  169. package/extensions/services/dataclaw/config.json5 +96 -0
  170. package/extensions/services/dataclaw/core/__init__.py +0 -0
  171. package/extensions/services/dataclaw/core/auth.py +95 -0
  172. package/extensions/services/dataclaw/core/config.py +50 -0
  173. package/extensions/services/dataclaw/core/database.py +70 -0
  174. package/extensions/services/dataclaw/entry.py +416 -0
  175. package/extensions/services/dataclaw/gofeed/351/241/271/347/233/256/346/211/200/346/234/211/346/235/203/350/275/254/347/247/273/346/265/201/347/250/213/350/257/264/346/230/216.md +309 -0
  176. package/extensions/services/dataclaw/migrate.py +283 -0
  177. package/extensions/services/dataclaw/models/__init__.py +0 -0
  178. package/extensions/services/dataclaw/module.md +49 -0
  179. package/extensions/services/dataclaw/requirements.txt +18 -0
  180. package/extensions/services/dataclaw/server.py +759 -0
  181. package/extensions/services/dataclaw/services/__init__.py +0 -0
  182. package/extensions/services/dataclaw/services/agent_service.py +132 -0
  183. package/extensions/services/dataclaw/services/credit_service.py +235 -0
  184. package/extensions/services/dataclaw/services/email_service.py +140 -0
  185. package/extensions/services/dataclaw/services/feed_service.py +259 -0
  186. package/extensions/services/dataclaw/services/notification_service.py +209 -0
  187. package/extensions/services/dataclaw/services/oauth_service.py +275 -0
  188. package/extensions/services/dataclaw/services/pricing.py +102 -0
  189. package/extensions/services/dataclaw/services/quality.py +79 -0
  190. package/extensions/services/dataclaw/services/reputation.py +142 -0
  191. package/extensions/services/dataclaw/services/sms_service.py +174 -0
  192. package/extensions/services/dataclaw/static/css/common.css +853 -0
  193. package/extensions/services/dataclaw/static/css/themes/blue.css +42 -0
  194. package/extensions/services/dataclaw/static/css/themes/dark.css +42 -0
  195. package/extensions/services/dataclaw/static/css/themes/light.css +35 -0
  196. package/extensions/services/dataclaw/static/js/api.js +103 -0
  197. package/extensions/services/dataclaw/static/js/common.js +321 -0
  198. package/extensions/services/dataclaw/static/js/i18n.js +95 -0
  199. package/extensions/services/dataclaw/static/js/pages/admin.js +152 -0
  200. package/extensions/services/dataclaw/static/js/pages/dashboard.js +82 -0
  201. package/extensions/services/dataclaw/static/js/pages/feed-detail.js +180 -0
  202. package/extensions/services/dataclaw/static/js/pages/feed-manage.js +158 -0
  203. package/extensions/services/dataclaw/static/js/theme.js +46 -0
  204. package/extensions/services/dataclaw/static/locales/en-US.json +464 -0
  205. package/extensions/services/dataclaw/static/locales/ja-JP.json +464 -0
  206. package/extensions/services/dataclaw/static/locales/zh-CN.json +464 -0
  207. package/extensions/services/dataclaw/templates/admin/index.html +90 -0
  208. package/extensions/services/dataclaw/templates/base.html +136 -0
  209. package/extensions/services/dataclaw/templates/credits/balance.html +106 -0
  210. package/extensions/services/dataclaw/templates/credits/deposit.html +164 -0
  211. package/extensions/services/dataclaw/templates/credits/history.html +90 -0
  212. package/extensions/services/dataclaw/templates/dashboard.html +52 -0
  213. package/extensions/services/dataclaw/templates/demands/create.html +78 -0
  214. package/extensions/services/dataclaw/templates/demands/detail.html +136 -0
  215. package/extensions/services/dataclaw/templates/demands/list.html +94 -0
  216. package/extensions/services/dataclaw/templates/feeds/create.html +95 -0
  217. package/extensions/services/dataclaw/templates/feeds/detail.html +110 -0
  218. package/extensions/services/dataclaw/templates/feeds/list.html +110 -0
  219. package/extensions/services/dataclaw/templates/feeds/manage.html +88 -0
  220. package/extensions/services/dataclaw/templates/index.html +185 -0
  221. package/extensions/services/dataclaw/templates/login.html +246 -0
  222. package/extensions/services/dataclaw/templates/register.html +164 -0
  223. package/extensions/services/dataclaw/templates/settings/notifications.html +96 -0
  224. package/extensions/services/dataclaw/templates/settings/profile.html +167 -0
  225. package/extensions/services/dataclaw/templates/subscriptions/list.html +64 -0
  226. package/extensions/services/dataclaw/tests/__init__.py +0 -0
  227. package/extensions/services/dataclaw/tests/conftest.py +68 -0
  228. package/extensions/services/dataclaw/tests/integration/__init__.py +0 -0
  229. package/extensions/services/dataclaw/tests/integration/test_workflows.py +239 -0
  230. package/extensions/services/dataclaw/tests/unit/__init__.py +0 -0
  231. package/extensions/services/dataclaw/tests/unit/test_admin.py +70 -0
  232. package/extensions/services/dataclaw/tests/unit/test_copyright.py +63 -0
  233. package/extensions/services/dataclaw/tests/unit/test_credits.py +80 -0
  234. package/extensions/services/dataclaw/tests/unit/test_data.py +98 -0
  235. package/extensions/services/dataclaw/tests/unit/test_demands.py +106 -0
  236. package/extensions/services/dataclaw/tests/unit/test_feeds.py +98 -0
  237. package/extensions/services/dataclaw/tests/unit/test_identity.py +88 -0
  238. package/extensions/services/dataclaw/tests/unit/test_notifications.py +36 -0
  239. package/extensions/services/dataclaw/tests/unit/test_reviews.py +68 -0
  240. package/extensions/services/dataclaw/tests/unit/test_search.py +64 -0
  241. package/extensions/services/dataclaw/tests/unit/test_subscriptions.py +65 -0
  242. package/extensions/services/dataclaw/tests/unit/test_system.py +106 -0
  243. package/extensions/services/dataclaw/utils/__init__.py +0 -0
  244. package/extensions/services/dataclaw/utils/crypto.py +38 -0
  245. package/extensions/services/dataclaw/utils/id_generator.py +52 -0
  246. package/extensions/services/dataclaw/ws/__init__.py +0 -0
  247. package/extensions/services/dataclaw/ws/handler.py +163 -0
  248. package/extensions/services/dataclaw//345/215/217/350/256/2561-/351/241/271/347/233/256/346/235/241/344/273/266/346/216/210/346/235/203/344/270/216/350/202/241/346/235/203/345/257/271/344/273/267/345/215/217/350/256/256.md +243 -0
  249. package/extensions/services/dataclaw//345/215/217/350/256/2562-/351/241/271/347/233/256/350/264/255/344/271/260/346/235/203/344/270/216/345/244/226/345/214/205/345/247/224/346/211/230/345/274/200/345/217/221/345/215/217/350/256/256.md +434 -0
  250. package/extensions/services/evol/__init__.py +1 -0
  251. package/extensions/services/evol/async_http.py +551 -0
  252. package/extensions/services/evol/auth_manager.py +602 -443
  253. package/extensions/services/evol/config.json5 +16 -0
  254. package/extensions/services/evol/entry.py +568 -406
  255. package/extensions/services/evol/evol_api.py +969 -173
  256. package/extensions/services/evol/mfa_totp.py +77 -0
  257. package/extensions/services/evol/module.md +150 -32
  258. package/extensions/services/evol/nonce_pool.py +113 -0
  259. package/extensions/services/evol/oauth_manager.py +223 -0
  260. package/extensions/services/evol/pairing.py +3 -2
  261. package/extensions/services/evol/pairing_codes.jsonl +1 -0
  262. package/extensions/services/evol/relay.py +1031 -682
  263. package/extensions/services/evol/relay_config.json5 +85 -67
  264. package/extensions/services/evol/routes/routes_llm.py +231 -0
  265. package/extensions/services/evol/routes/routes_rpc.py +90 -89
  266. package/extensions/services/evol/routes/routes_test.py +11 -4
  267. package/extensions/services/evol/server.py +2426 -875
  268. package/extensions/services/evol/static/assets/CommissionView-Cs_ys6Gm.js +1 -0
  269. package/extensions/services/evol/static/assets/CommissionView-DACet_Oo.css +1 -0
  270. package/extensions/services/evol/static/assets/IframePage-DbO11U9G.js +1 -0
  271. package/extensions/services/evol/static/assets/IframePage-c572lT8i.css +1 -0
  272. package/extensions/services/evol/static/assets/TeamDetailView-DULrGD7k.css +1 -0
  273. package/extensions/services/evol/static/assets/TeamDetailView-gy_MBEqG.js +139 -0
  274. package/extensions/services/evol/static/assets/element-plus-Bd7pZkkM.js +63 -0
  275. package/extensions/services/evol/static/assets/index-CmMONKzG.css +1 -0
  276. package/extensions/services/evol/static/assets/index-D44bBe__.js +2 -0
  277. package/extensions/services/evol/static/assets/vue-vendor-DtF-__I4.js +29 -0
  278. package/extensions/services/evol/static/index.html +16 -781
  279. package/extensions/services/evol/static/logo.png +0 -0
  280. package/extensions/services/evol/stats_manager.py +243 -240
  281. package/extensions/services/evol/web/README.md +89 -0
  282. package/extensions/services/evol/web/build.bat +44 -0
  283. package/extensions/services/evol/web/index.html +13 -0
  284. package/extensions/services/evol/web/package-lock.json +1718 -0
  285. package/extensions/services/evol/web/package.json +26 -0
  286. package/extensions/services/evol/web/public/logo.png +0 -0
  287. package/extensions/services/evol/web/src/App.vue +7 -0
  288. package/extensions/services/evol/web/src/components/layout/AppHeader.vue +202 -0
  289. package/extensions/services/evol/web/src/components/layout/AppLayout.vue +61 -0
  290. package/extensions/services/evol/web/src/components/layout/AppSidebar.vue +115 -0
  291. package/extensions/services/evol/web/src/components/login/LoginPage.vue +271 -0
  292. package/extensions/services/evol/web/src/components/team/AddMemberModal.vue +181 -0
  293. package/extensions/services/evol/web/src/components/team/GroupTreeNode.vue +156 -0
  294. package/extensions/services/evol/web/src/components/team/TeamAlertConfig.vue +221 -0
  295. package/extensions/services/evol/web/src/components/team/TeamBillModal.vue +165 -0
  296. package/extensions/services/evol/web/src/components/team/TeamMembersAndGroups.vue +499 -0
  297. package/extensions/services/evol/web/src/components/team/TeamStatsPanel.vue +907 -0
  298. package/extensions/services/evol/web/src/components/team/TreeNode.vue +331 -0
  299. package/extensions/services/evol/web/src/components/team/stats/StatsExportProgress.vue +44 -0
  300. package/extensions/services/evol/web/src/components/team/stats/StatsHeader.vue +89 -0
  301. package/extensions/services/evol/web/src/components/team/stats/StatsMemberDetail.vue +415 -0
  302. package/extensions/services/evol/web/src/components/team/stats/StatsSummary.vue +42 -0
  303. package/extensions/services/evol/web/src/components/team/stats/helpers.ts +195 -0
  304. package/extensions/services/evol/web/src/components/team/stats/stats.css +741 -0
  305. package/extensions/services/evol/web/src/components/team/stats/useStatsApi.ts +114 -0
  306. package/extensions/services/evol/web/src/components/team/stats/useStatsCharts.ts +242 -0
  307. package/extensions/services/evol/web/src/components/team/stats/useStatsExport.ts +232 -0
  308. package/extensions/services/evol/web/src/composables/useFormatters.ts +42 -0
  309. package/extensions/services/evol/web/src/composables/useTheme.ts +52 -0
  310. package/extensions/services/evol/web/src/env.d.ts +7 -0
  311. package/extensions/services/evol/web/src/i18n/en.ts +361 -0
  312. package/extensions/services/evol/web/src/i18n/index.ts +36 -0
  313. package/extensions/services/evol/web/src/i18n/zh.ts +379 -0
  314. package/extensions/services/evol/web/src/main.ts +21 -0
  315. package/extensions/services/evol/web/src/router/index.ts +81 -0
  316. package/extensions/services/evol/web/src/services/kernel-client.ts +406 -0
  317. package/extensions/services/evol/web/src/stores/auth.ts +189 -0
  318. package/extensions/services/evol/web/src/stores/connection.ts +134 -0
  319. package/extensions/services/evol/web/src/stores/pages.ts +79 -0
  320. package/extensions/services/evol/web/src/styles/base.css +213 -0
  321. package/extensions/services/evol/web/src/styles/variables.css +138 -0
  322. package/extensions/services/evol/web/src/types/rpc.ts +35 -0
  323. package/extensions/services/evol/web/src/types/token.ts +87 -0
  324. package/extensions/services/evol/web/src/views/AccountView.vue +1532 -0
  325. package/extensions/services/evol/web/src/views/AiServiceView.vue +219 -0
  326. package/extensions/services/evol/web/src/views/CommissionView.vue +1220 -0
  327. package/extensions/services/evol/web/src/views/CreditsView.vue +131 -0
  328. package/extensions/services/evol/web/src/views/EndpointView.vue +163 -0
  329. package/extensions/services/evol/web/src/views/IframePage.vue +120 -0
  330. package/extensions/services/evol/web/src/views/TeamDetailView.vue +473 -0
  331. package/extensions/services/evol/web/src/views/TeamView.vue +332 -0
  332. package/extensions/services/evol/web/tsconfig.json +31 -0
  333. package/extensions/services/evol/web/tsconfig.node.json +10 -0
  334. package/extensions/services/evol/web/vite.config.ts +49 -0
  335. package/extensions/services/evolmem/__init__.py +0 -0
  336. package/extensions/services/evolmem/entry.py +387 -0
  337. package/extensions/services/evolmem/hooks/__init__.py +0 -0
  338. package/extensions/services/evolmem/hooks/assistant_stop.py +228 -0
  339. package/extensions/services/evolmem/hooks/common.py +76 -0
  340. package/extensions/services/evolmem/hooks/pre_tool_use.py +56 -0
  341. package/extensions/services/evolmem/hooks/session_end.py +133 -0
  342. package/extensions/services/evolmem/hooks/session_start.py +229 -0
  343. package/extensions/services/evolmem/hooks/user_prompt.py +122 -0
  344. package/extensions/services/evolmem/module.md +48 -0
  345. package/extensions/services/evolmem/prompts/00-server-info.md +28 -0
  346. package/extensions/services/evolmem/prompts/01-behavior.md +46 -0
  347. package/extensions/services/evolmem/prompts/02-summary-format.md +112 -0
  348. package/extensions/services/evolmem/prompts/03-file-query.md +92 -0
  349. package/extensions/services/evolmem/prompts/04-topic-stats.md +11 -0
  350. package/extensions/services/evolmem/prompts/05-recent-topics.md +84 -0
  351. package/extensions/services/evolmem/scripts/__init__.py +0 -0
  352. package/extensions/services/evolmem/scripts/extract_keywords.py +40 -0
  353. package/extensions/services/evolmem/scripts/search_topics.py +91 -0
  354. package/extensions/services/evolmem/server.py +641 -0
  355. package/extensions/services/gateway/entry.py +964 -0
  356. package/extensions/services/gateway/module.md +29 -0
  357. package/extensions/services/gateway/nonce_pool.py +65 -0
  358. package/extensions/services/gateway/relay.py +133 -0
  359. package/extensions/services/gateway/ws_server.py +285 -0
  360. package/extensions/services/kite_console/auth_manager.py +603 -0
  361. package/extensions/services/kite_console/config.json5 +19 -0
  362. package/extensions/services/kite_console/config_loader.py +117 -0
  363. package/extensions/services/kite_console/entry.py +528 -0
  364. package/extensions/services/kite_console/evol_api.py +179 -0
  365. package/extensions/services/kite_console/evol_config.json5 +29 -0
  366. package/extensions/services/kite_console/mfa_totp.py +77 -0
  367. package/extensions/services/kite_console/migrate_tokens.py +122 -0
  368. package/extensions/services/kite_console/module.md +37 -0
  369. package/extensions/services/kite_console/nonce_pool.py +113 -0
  370. package/extensions/services/kite_console/oauth_manager.py +223 -0
  371. package/extensions/services/kite_console/pairing.py +280 -0
  372. package/extensions/services/kite_console/pairing_codes.jsonl +2 -0
  373. package/extensions/services/kite_console/relay.py +1350 -0
  374. package/extensions/services/kite_console/relay_config.json5 +96 -0
  375. package/extensions/services/kite_console/routes/__init__.py +1 -0
  376. package/extensions/services/kite_console/routes/routes_llm.py +231 -0
  377. package/extensions/services/kite_console/routes/routes_proxy.py +115 -0
  378. package/extensions/services/kite_console/routes/routes_rpc.py +89 -0
  379. package/extensions/services/kite_console/routes/routes_test.py +68 -0
  380. package/extensions/services/kite_console/server.py +1742 -0
  381. package/extensions/services/{evol → kite_console}/static/css/style.css +656 -2
  382. package/extensions/services/kite_console/static/index.html +1524 -0
  383. package/extensions/services/{evol → kite_console}/static/js/dialog.js +11 -4
  384. package/extensions/services/kite_console/static/js/evol-app.js +7740 -0
  385. package/extensions/services/{evol/static/js/evol-app.js → kite_console/static/js/evol-app.js.backup} +2777 -1949
  386. package/extensions/services/kite_console/static/js/kernel-client.js +560 -0
  387. package/extensions/services/{evol/static/js/kernel-client.js → kite_console/static/js/kernel-client.js.backup} +41 -3
  388. package/extensions/services/{evol → kite_console}/static/js/registry-tests.js +7 -0
  389. package/extensions/services/kite_console/static/js/tests/ARCHITECTURE.md +67 -0
  390. package/extensions/services/kite_console/static/js/tests/README.md +140 -0
  391. package/extensions/services/kite_console/static/js/tests/index.js +161 -0
  392. package/extensions/services/kite_console/static/js/tests/integration/auth.js +120 -0
  393. package/extensions/services/kite_console/static/js/tests/integration/channel-interaction.js +188 -0
  394. package/extensions/services/kite_console/static/js/tests/integration/elastic-connection.js +115 -0
  395. package/extensions/services/kite_console/static/js/tests/integration/full-workflow.js +43 -0
  396. package/extensions/services/kite_console/static/js/tests/integration/multi-instance.js +304 -0
  397. package/extensions/services/kite_console/static/js/tests/integration/nested-rpc.js +266 -0
  398. package/extensions/services/kite_console/static/js/tests/integration/pingpong.js +25 -0
  399. package/extensions/services/kite_console/static/js/tests/integration/redis.js +227 -0
  400. package/extensions/services/kite_console/static/js/tests/integration/registry-core.js +52 -0
  401. package/extensions/services/kite_console/static/js/tests/integration/remote-deploy.js +85 -0
  402. package/extensions/services/kite_console/static/js/tests/integration/require-init.js +96 -0
  403. package/extensions/services/kite_console/static/js/tests/integration/scaling-control.js +193 -0
  404. package/extensions/services/kite_console/static/js/tests/integration/trace.js +109 -0
  405. package/extensions/services/kite_console/static/js/tests/modules/acp_channel.js +339 -0
  406. package/extensions/services/kite_console/static/js/tests/modules/auth.js +96 -0
  407. package/extensions/services/kite_console/static/js/tests/modules/backup.js +49 -0
  408. package/extensions/services/kite_console/static/js/tests/modules/gateway.js +41 -0
  409. package/extensions/services/kite_console/static/js/tests/modules/kernel.js +90 -0
  410. package/extensions/services/kite_console/static/js/tests/modules/launcher.js +75 -0
  411. package/extensions/services/kite_console/static/js/tests/modules/multi_instance.js +129 -0
  412. package/extensions/services/kite_console/static/js/tests/modules/phone_channel.js +364 -0
  413. package/extensions/services/kite_console/static/js/tests/modules/redis.js +178 -0
  414. package/extensions/services/kite_console/static/js/tests/modules/watchdog.js +60 -0
  415. package/extensions/services/kite_console/static/js/tests/modules/web.js +70 -0
  416. package/extensions/services/kite_console/static/js/tests/test-runner.js +123 -0
  417. package/extensions/services/kite_console/static/js/virtual-list.js +200 -0
  418. package/extensions/services/kite_console/static/test_kernel_client_token.html +352 -0
  419. package/extensions/services/kite_console/stats_manager.py +247 -0
  420. package/extensions/services/logs/README.md +215 -0
  421. package/extensions/services/logs/api_logger.py +37 -0
  422. package/extensions/services/logs/baseline.py +121 -0
  423. package/extensions/services/logs/cleaner.py +76 -0
  424. package/extensions/services/logs/entry.py +449 -0
  425. package/extensions/services/logs/formatter.py +129 -0
  426. package/extensions/services/logs/module.md +38 -0
  427. package/extensions/services/logs/quick_diagnostic.py +128 -0
  428. package/extensions/services/logs/routes/__init__.py +1 -0
  429. package/extensions/services/logs/routes/routes_logs.py +218 -0
  430. package/extensions/services/logs/routes/routes_logs.py.backup +173 -0
  431. package/extensions/services/logs/scanner.py +100 -0
  432. package/extensions/services/logs/searcher.py +263 -0
  433. package/extensions/services/logs/server.py +553 -0
  434. package/extensions/services/logs.zip +0 -0
  435. package/extensions/services/model_service/config.json5 +30 -0
  436. package/extensions/services/model_service/entry.py +620 -171
  437. package/extensions/services/model_service/module.md +11 -2
  438. package/extensions/services/proxy/__init__.py +0 -0
  439. package/extensions/services/proxy/aid_manager.py +419 -0
  440. package/extensions/services/proxy/auth_bridge.py +182 -0
  441. package/extensions/services/proxy/config_store.py +79 -0
  442. package/extensions/services/proxy/entry.py +528 -0
  443. package/extensions/services/proxy/evol/presenter/agentIdPresenter.py +2 -2
  444. package/extensions/services/proxy/evol/presenter/apikeyPresenter.py +18 -28
  445. package/extensions/services/proxy/evol/presenter/configPresenter.py +80 -1127
  446. package/extensions/services/proxy/evol/presenter/userPresenter.py +71 -477
  447. package/extensions/services/proxy/evol/server/claude_proxy_async.py +11 -7
  448. package/extensions/services/proxy/module.md +151 -0
  449. package/extensions/services/proxy/server.py +952 -271
  450. package/extensions/services/redis/ALIGNMENT_CHECKLIST.md +121 -0
  451. package/extensions/services/redis/ALIGNMENT_STATUS.md +548 -0
  452. package/extensions/services/redis/config.json5 +8 -0
  453. package/extensions/services/redis/entry.py +1509 -0
  454. package/extensions/services/redis/entry.py.backup +405 -0
  455. package/extensions/services/redis/module.md +48 -0
  456. package/extensions/services/redis/redis_builtin.py +332 -0
  457. package/extensions/services/redis/redis_external.py +164 -0
  458. package/extensions/services/testUi/entry.py +446 -0
  459. package/extensions/services/testUi/module.md +18 -0
  460. package/extensions/services/testUi/ui/cards.html +131 -0
  461. package/extensions/services/testUi/ui/index.html +22 -0
  462. package/extensions/services/testUi/ui/particles.html +143 -0
  463. package/extensions/services/watchdog/entry.py +1258 -793
  464. package/extensions/services/watchdog/module.md +2 -0
  465. package/extensions/services/watchdog/monitor.py +465 -87
  466. package/extensions/services/web/auth_manager.py +602 -0
  467. package/extensions/services/web/config.json5 +11 -0
  468. package/extensions/services/web/entry.py +598 -478
  469. package/extensions/services/web/mfa_totp.py +77 -0
  470. package/extensions/services/web/module.md +16 -13
  471. package/extensions/services/web/nonce_pool.py +113 -0
  472. package/extensions/services/web/oauth_manager.py +223 -0
  473. package/extensions/services/web/pairing.py +3 -2
  474. package/extensions/services/web/pairing_codes.jsonl +1 -0
  475. package/extensions/services/web/relay.py +442 -63
  476. package/extensions/services/web/relay_config.json5 +1 -2
  477. package/extensions/services/web/routes/routes_rpc.py +6 -6
  478. package/extensions/services/web/server.py +360 -173
  479. package/extensions/services/web/static/index.html +1752 -1738
  480. package/extensions/services/web/static/js/app.js +32 -0
  481. package/extensions/services/web/static/js/kernel-client.js +48 -9
  482. package/extensions/services/web/vendor/bluetooth/audio.py +1 -1
  483. package/extensions/services/web/vendor/config.py +2 -2
  484. package/extensions/services/web/vendor/storage/identity.py +1 -1
  485. package/kernel/entry.py +77 -23
  486. package/kernel/event_hub.py +1122 -74
  487. package/kernel/module.md +2 -1
  488. package/kernel/registry_store.py +208 -11
  489. package/kernel/rpc_router.py +1400 -491
  490. package/kernel/server.py +1021 -134
  491. package/kite_cli/builders/__init__.py +4 -0
  492. package/kite_cli/builders/base.py +67 -0
  493. package/kite_cli/builders/custom.py +31 -0
  494. package/kite_cli/builders/detector.py +56 -0
  495. package/kite_cli/builders/go.py +34 -0
  496. package/kite_cli/builders/gradle.py +41 -0
  497. package/kite_cli/builders/maven.py +36 -0
  498. package/kite_cli/builders/npm.py +44 -0
  499. package/kite_cli/builders/python.py +37 -0
  500. package/kite_cli/commands/BUILD_GUIDE.md +109 -0
  501. package/kite_cli/commands/build.py +142 -0
  502. package/kite_cli/commands/check.py +60 -0
  503. package/kite_cli/commands/config.py +156 -0
  504. package/kite_cli/commands/deps.py +58 -0
  505. package/kite_cli/commands/deps_install.py +7 -7
  506. package/kite_cli/commands/disable.py +162 -0
  507. package/kite_cli/commands/enable.py +162 -0
  508. package/kite_cli/commands/export.py +96 -0
  509. package/kite_cli/commands/import_cmd.py +110 -0
  510. package/kite_cli/commands/install.py +50 -23
  511. package/kite_cli/commands/install_skill.py +107 -0
  512. package/kite_cli/commands/list.py +128 -31
  513. package/kite_cli/commands/outdated.py +202 -0
  514. package/kite_cli/commands/search.py +33 -17
  515. package/kite_cli/commands/update.py +115 -2
  516. package/kite_cli/commands/venv_setup.py +6 -6
  517. package/kite_cli/commands/why.py +48 -0
  518. package/kite_cli/core/config_manager.py +145 -0
  519. package/kite_cli/core/downloader.py +32 -2
  520. package/kite_cli/main.py +151 -5
  521. package/kite_cli/utils/colors.py +153 -0
  522. package/kite_cli/utils/dependency_graph.py +209 -0
  523. package/kite_cli/utils/process.py +55 -0
  524. package/kite_cli/utils/progress.py +207 -0
  525. package/kite_cli/utils/table.py +101 -0
  526. package/launcher/count_lines.py +192 -43
  527. package/launcher/entry.py +4543 -2802
  528. package/launcher/logging_setup.py +54 -1
  529. package/launcher/module.md +32 -6
  530. package/launcher/module_scanner.py +93 -20
  531. package/launcher/process_manager.py +355 -76
  532. package/main.py +6 -0
  533. package/package.json +4 -1
  534. package/requirements.txt +41 -38
  535. package/scripts/auto-fix-deps.py +128 -0
  536. package/scripts/env-manager.js +25 -2
  537. package/scripts/final-test.js +78 -0
  538. package/scripts/setup-python-env.js +700 -191
  539. package/scripts/test-alluser.js +48 -0
  540. package/scripts/test-different-version.js +86 -0
  541. package/scripts/test-direct.js +63 -0
  542. package/scripts/test-extract-installer.js +28 -0
  543. package/scripts/test-install-log.js +54 -0
  544. package/scripts/test-installer.js +39 -0
  545. package/scripts/test-integration.js +250 -0
  546. package/scripts/test-real-install.js +210 -0
  547. package/scripts/test-targetdir.js +49 -0
  548. package/scripts/test-venv-real.js +47 -0
  549. package/scripts/test-venv-simple.js +57 -0
  550. package/scripts/test-wait.js +49 -0
  551. package/scripts/test-with-log.js +63 -0
  552. package/extensions/services/evol/config.yaml +0 -149
  553. package/extensions/services/evol/routes/routes_management_ws.py +0 -127
  554. package/extensions/services/evol/static/index_evol.html +0 -14
  555. package/extensions/services/evol/static/js/app.js +0 -6304
  556. package/extensions/services/evol/static/js/auth.js +0 -326
  557. package/extensions/services/evol/static/js/evol-app-fixed.js +0 -50
  558. package/extensions/services/evol/static/js/evol-app.js.bak +0 -1800
  559. package/extensions/services/evol/static/js/kernel-client-example.js +0 -228
  560. package/extensions/services/evol/static/js/main.js +0 -141
  561. package/extensions/services/evol/static/js/stats.js +0 -217
  562. package/extensions/services/evol/static/js/token-manager.js +0 -175
  563. package/extensions/services/proxy/CHANGELOG_20260308.md +0 -258
  564. package/extensions/services/proxy/_fix_prints.py +0 -133
  565. package/extensions/services/proxy/_fix_prints2.py +0 -87
  566. package/extensions/services/proxy/console_auth.py +0 -109
  567. package/extensions/services/proxy/logs/websocket.log +0 -260
  568. package/extensions/services/proxy/main.py +0 -240
  569. package/extensions/services/proxy/requirements.txt +0 -13
  570. package/extensions/services/web/config.yaml +0 -149
  571. /package/extensions/services/{evol → kite_console}/static/pairing.html +0 -0
  572. /package/extensions/services/{evol → kite_console}/static/test_registry.html +0 -0
  573. /package/extensions/services/{evol → kite_console}/static/test_relay.html +0 -0
@@ -0,0 +1,567 @@
1
+ # Kite 系统启动流程
2
+
3
+ 本文档完整描述 Kite 框架从 `main.py` 到所有模块就绪的全部流程和机制细节。
4
+
5
+ ## 启动阶段总览
6
+
7
+ ```
8
+ main.py
9
+ └─ Launcher.__init__() → .run()
10
+ └─ _async_main()
11
+ ├─ Phase 1: 启动 Kernel + 并行任务
12
+ │ ├─ 1. 启动 Kernel 进程
13
+ │ ├─ 2. 等待 Kernel 输出端口 + launcher_token
14
+ │ ├─ 3. 设置 KITE_KERNEL_PORT 环境变量
15
+ │ └─ 4. 并行执行:
16
+ │ ├─ A: 扫描模块
17
+ │ ├─ B: 连接 Kernel WS → 注册 → 生成 token → 等待 Kernel ready
18
+ │ └─ C: 启动扩展模块进程 → 等 token → 发送 token
19
+ ├─ 清理残留进程(非阻塞)
20
+ ├─ Phase 2: 发 module.starting → 等待扩展模块就绪
21
+ ├─ system.ready 事件
22
+ └─ 监控循环
23
+ ```
24
+
25
+ **典型时间线(优化后):**
26
+
27
+ | 时间点 | 事件 |
28
+ |--------|------|
29
+ | 0ms | Launcher 启动 Kernel 进程 |
30
+ | ~67ms | Kernel 进程已创建 |
31
+ | ~177ms | Kernel 输出端口 + launcher_token |
32
+ | ~177ms | 并行: 扫描模块 / 连接 WS / 启动扩展模块 |
33
+ | ~200ms | 扩展模块进程已创建,开始 Python 冷启动 |
34
+ | ~700ms | 扩展模块冷启动完成,等待 stdin(阻塞在 readline) |
35
+ | ~800ms | Token 生成完成,发送到各模块 stdin |
36
+ | ~800ms | Kernel module.ready |
37
+ | ~1350ms | 所有扩展模块 module.ready |
38
+ | ~1400ms | system.ready |
39
+
40
+ ## Phase 1: 启动 Kernel
41
+
42
+ ### 1.1 Kernel 进程启动
43
+
44
+ Launcher 构造 `ModuleInfo` 并调用 `ProcessManager.start_module()` 启动 Kernel 进程。
45
+
46
+ ```
47
+ Launcher
48
+ └─ process_manager.start_module(kernel_info, boot_info=None)
49
+ └─ subprocess.Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
50
+ ```
51
+
52
+ **stdin 管道规则:所有模块一律创建 stdin 管道(`stdin=subprocess.PIPE`),无论是否有初始数据要写。** 即使是 Kernel 也创建管道,为后续扩展预留通道(如 Launcher 向 Kernel 报告启动进度)。`boot_info` 参数仅控制是否在启动时立即写入数据,不影响管道的创建。
53
+
54
+ 关键代码路径:`launcher/entry.py:_phase1_start_kernel()`
55
+
56
+ ### 1.2 Kernel 端口绑定与输出
57
+
58
+ Kernel 进程启动后的执行顺序(关键在于 **延迟导入**):
59
+
60
+ 1. 加载 `module.md` 配置(模块名、preferred_port)
61
+ 2. 绑定端口(优先使用 preferred_port,失败则系统分配)
62
+ 3. 生成 `launcher_token`(`secrets.token_urlsafe(32)`)
63
+ 4. **立即输出端口信息到 stdout**(结构化 JSON)
64
+ 5. **延迟导入** `uvicorn` 和 `KernelServer`(重量级依赖)
65
+ 6. 创建 `KernelServer`、自注册
66
+ 7. 启动 uvicorn
67
+
68
+ **端口输出协议(Kernel → Launcher):**
69
+
70
+ ```json
71
+ {"kite": "port", "port": 19900, "token": "launcher_kite_token_xxx"}
72
+ ```
73
+
74
+ - `kite: "port"` — 结构化消息标识
75
+ - `port` — Kernel 实际绑定的端口
76
+ - `token` — launcher_token,Launcher 用此 token 连接 Kernel WS
77
+
78
+ 关键代码路径:`kernel/entry.py:main()`
79
+
80
+ ### 1.3 Launcher 等待端口
81
+
82
+ Launcher 通过 `_wait_kite_message()` 等待 Kernel stdout 输出端口信息:
83
+
84
+ - ProcessManager 的 stdout reader 线程逐行读取子进程 stdout
85
+ - 检测到 `{"kite": "port"}` 格式后,通过 `_on_kite_message` 回调通知 Launcher
86
+ - Launcher 主线程通过 `threading.Event` 等待(带 6s 超时)
87
+ - 等待过程中每 0.5s 检查一次 shutdown 标志,确保 Ctrl+C 响应
88
+
89
+ 拿到端口后:
90
+ - 设置 `KITE_KERNEL_PORT` 环境变量(子进程继承)
91
+ - 保存 `launcher_token` 到 `_module_tokens["launcher"]`
92
+
93
+ ### 1.4 并行任务
94
+
95
+ 拿到 Kernel 端口后,Launcher 用 `asyncio.gather()` 并行执行三个任务:
96
+
97
+ #### 任务 A: 扫描模块
98
+
99
+ ```
100
+ 扫描 extensions/ 下所有模块目录(读取 module.md)
101
+ → 得到模块列表(名称、状态、运行时、依赖等)
102
+ → set _modules_scanned 事件(通知任务 B、C)
103
+ ```
104
+
105
+ 扫描很快(~23ms),完成后任务 B 和 C 都可以继续推进。
106
+
107
+ #### 任务 B: 连接 Kernel WS + 生成 token
108
+
109
+ ```
110
+ 连接 Kernel WS(连接后首条消息认证)
111
+ → 启动接收循环(_ws_receiver)
112
+ → 订阅所有事件(event.subscribe)
113
+ → 注册 Launcher 自身到注册中心
114
+ → 发布 Launcher 的 module.ready 事件
115
+ → 等待模块扫描完成(_modules_scanned)
116
+ → 通过 RPC 调用 kernel.generate_tokens 生成各模块 token
117
+ → set _tokens_generated 事件(通知任务 C)
118
+ → 等待 Kernel 的 module.ready 事件
119
+ ```
120
+
121
+ Token 生成依赖 WS 连接就绪 + 模块扫描完成,由 Kernel 通过 RPC 完成。每个模块有唯一的 token,用于连接 Kernel WS 时的身份认证。
122
+
123
+ **Token 生成失败处理:** 如果 RPC 失败或返回错误,设置 `_token_error` 标志并 set `_tokens_generated` 事件,让任务 C 检测到错误并向所有模块发送失败消息后退出。
124
+
125
+ **注意事项:**
126
+ - 接收循环必须先启动,再发送 RPC 请求(否则死锁)
127
+ - `module.ready:kernel` 的 event waiter 必须在订阅事件之前注册(防止竞态)
128
+
129
+ #### 任务 C: 启动扩展模块进程(优化核心)
130
+
131
+ ```
132
+ 等待模块扫描完成(_modules_scanned,带超时)
133
+ → 筛选 enabled 且非核心的模块
134
+ → 启动进程(boot_info=None,创建管道但不写数据)
135
+ → 等待 token 生成完成(_tokens_generated,带 10s 超时)
136
+ → 检查 _token_error:
137
+ 有错误 → 向所有模块 stdin 发送错误消息 → 抛异常
138
+ 无错误 → 向所有模块 stdin 发送 token
139
+ ```
140
+
141
+ **任务间同步使用 `asyncio.Event`**,不使用忙等待(`while not ...: sleep`):
142
+
143
+ - `_modules_scanned` — 任务 A 完成后 set
144
+ - `_tokens_generated` — 任务 B 生成 token 后 set(成功或失败都 set)
145
+
146
+ 两处等待都通过 `asyncio.wait_for(..., timeout=N)` 设置超时,避免永久阻塞。
147
+
148
+ **这是启动优化的核心:** 扩展模块的 Python 冷启动(~400ms)与 Kernel 的 token 生成(~500ms)并行执行,节省 ~1050ms。
149
+
150
+ ### 1.5 Phase 1 完成后
151
+
152
+ - 发布 `module.started` 事件(Kernel)
153
+ - 关闭 Kernel 的 stdin(`close_stdio("kernel")`)
154
+ - 执行残留进程清理(本地 + 全局,非阻塞)
155
+
156
+ ## Phase 2: 等待模块就绪
157
+
158
+ Phase 2 **只等待**,不启动进程(进程已在 Phase 1 的任务 C 中启动)。
159
+
160
+ ```
161
+ 筛选 desired_state == "running" 的扩展模块
162
+ → 对每个模块: 发布 module.starting 事件
163
+ → asyncio.gather(*(wait_module_ready(info) for info in to_wait))
164
+ ```
165
+
166
+ **`module.starting` 事件在 Phase 2 发布**,不在 Phase 1 任务 C 中发布。原因:任务 C 启动进程时 WS 可能还没连上,无法发布事件。Phase 2 时 WS 已就绪,事件能正常路由。
167
+
168
+ 每个模块的等待逻辑:
169
+
170
+ ```
171
+ 注册 module.ready:{module_name} 事件等待器
172
+ → asyncio.wait_for(ready_evt.wait(), timeout=模块配置的 timeout)
173
+ → 收到 module.ready:
174
+ 记录 ready_timestamp
175
+ 记录 graceful_shutdown 能力
176
+ 发布 module.started 事件
177
+ 关闭 stdin(close_stdio)
178
+ → 收到 module.exiting(_exited 标记):
179
+ 模块主动退出,记录原因
180
+ → 超时:
181
+ 见下方"模块启动超时"章节
182
+ ```
183
+
184
+ 关键代码路径:`launcher/entry.py:_phase2_start_modules()` 和 `_wait_module_ready()`
185
+
186
+ ### 首次启动 vs 运行时重启
187
+
188
+ | | 首次启动(Phase 1 + 2) | 运行时重启(`_start_one_module`) |
189
+ |---|---|---|
190
+ | 进程创建 | 任务 C 提前创建,boot_info=None | 创建时直接写 boot_info={"token":"xxx"} |
191
+ | token 发送 | 任务 C 等 token 后通过 write_stdin 发送 | 创建时已包含在 boot_info 中 |
192
+ | module.starting | Phase 2 进入等待时发布 | _start_one_module 内发布 |
193
+ | 目的 | 并行冷启动,优化启动速度 | 标准流程,简单直接 |
194
+
195
+ 模块端无需区分两种场景——都是从 stdin 读到 `{"token":"xxx"}` 后继续执行。
196
+
197
+ ## Token 认证机制
198
+
199
+ ### Token 类型
200
+
201
+ | Token | 生成方 | 用途 |
202
+ |-------|--------|------|
203
+ | `launcher_token` | Kernel(启动时) | Launcher 连接 Kernel WS 的凭证 |
204
+ | 模块 token | Kernel(RPC 生成) | 各模块连接 Kernel WS 的凭证 |
205
+
206
+ ### Token 流转
207
+
208
+ ```
209
+ Kernel 启动
210
+ → 生成 launcher_token
211
+ → stdout 输出给 Launcher
212
+ → Launcher 连接 WS → 首条消息认证
213
+ → Launcher 通过 RPC kernel.generate_tokens 请求模块 token
214
+ → Kernel 生成并返回 {module_name: token} 映射
215
+ → Launcher 通过 stdin 发送 token 给各模块
216
+ → 各模块连接 Kernel WS → 首条消息认证
217
+ ```
218
+
219
+ ### WS 连接认证
220
+
221
+ **Token 不放在 URL 中**,通过连接后首条消息认证,避免 token 泄露到日志:
222
+
223
+ ```
224
+ WS 连接建立: ws://127.0.0.1:{port}/ws?id={module_name}
225
+ → 模块发送: {"jsonrpc":"2.0", "id":"1", "method":"auth", "params":{"token":"xxx"}}
226
+ → Kernel 校验 token 与 module_name 是否匹配
227
+ → 通过: 返回 {"jsonrpc":"2.0", "id":"1", "result":{"ok":true}}
228
+ 连接进入已认证状态,开始正常 JSON-RPC 2.0 通信
229
+ → 失败: 返回 error → 关闭连接(4001)
230
+ → 超时(5s 内未收到 auth): 关闭连接(4003)
231
+ ```
232
+
233
+ **未认证状态下 Kernel 的行为:**
234
+ - 只接受 `method: "auth"` 请求
235
+ - 拒绝所有其他 RPC 请求和事件订阅
236
+ - 不转发任何事件
237
+
238
+ 使用 JSON-RPC 2.0 格式(而非自定义 kite 消息)进行认证,保持协议统一——连接上来第一条消息就是标准 RPC 调用,Kernel 正常返回 response。
239
+
240
+ ### 调试模式
241
+
242
+ 设置 `KITE_DEBUG=1` 时,Kernel 接受所有 token(跳过验证),用于开发调试。启动时输出红色警告:
243
+
244
+ ```
245
+ [kernel] ⚠ 调试模式已启用 (KITE_DEBUG=1),接受所有令牌,请勿在生产环境使用
246
+ ```
247
+
248
+ ## stdin/stdout 协议
249
+
250
+ ### stdout 协议(子进程 → Launcher)
251
+
252
+ 子进程 stdout 的每一行被 ProcessManager 的 reader 线程读取:
253
+
254
+ - **结构化消息:** 以 `{` 开头的 JSON,且包含 `"kite"` 字段 → 通过 `_on_kite_message` 回调分发
255
+ - **普通日志:** 其他内容 → 添加 `[module_name]` 前缀后打印
256
+
257
+ 已知的结构化消息类型:
258
+
259
+ | kite 类型 | 方向 | 说明 |
260
+ |-----------|------|------|
261
+ | `port` | Kernel → Launcher | Kernel 端口 + launcher_token |
262
+
263
+ ### stdin 协议(Launcher → 子进程)
264
+
265
+ **所有模块启动时一律创建 stdin 管道(`stdin=subprocess.PIPE`)。** `boot_info` 参数仅控制是否立即写入数据,不影响管道创建。
266
+
267
+ Launcher 通过 `write_stdin()` 向模块发送 JSON 行(`\n` 结尾):
268
+
269
+ | 场景 | 数据格式 |
270
+ |------|----------|
271
+ | 正常启动(首次) | `{"token": "xxx"}`(延迟发送) |
272
+ | 正常启动(运行时重启) | `{"token": "xxx"}`(创建时立即写入) |
273
+ | Token 生成超时 | `{"error": "token_generation_timeout", "message": "..."}` |
274
+
275
+ **管道缓冲机制:** Launcher 写入 stdin 时,即使模块还没执行到 `readline()`,数据也不会丢失。stdin 是管道(pipe),操作系统提供内核缓冲区,写入的数据会保留直到被读取。
276
+
277
+ ### stdin 关闭检测
278
+
279
+ 模块端 `sys.stdin.readline()` 在 stdin 被关闭时返回空字符串 `""`:
280
+
281
+ ```python
282
+ line = sys.stdin.readline()
283
+ if not line: # stdin 被关闭,Launcher 可能已退出
284
+ sys.exit(1)
285
+ ```
286
+
287
+ ## 环境变量传递
288
+
289
+ ### Launcher 设置的环境变量
290
+
291
+ | 变量 | 设置时机 | 说明 |
292
+ |------|----------|------|
293
+ | `KITE_PROJECT` | main.py 启动时 | 项目根目录 |
294
+ | `KITE_INSTANCE` | Launcher.__init__ | 实例 ID(PID) |
295
+ | `KITE_INSTANCE_DIR` | Launcher.__init__ | 实例数据目录 |
296
+ | `KITE_WORKSPACE` | Launcher.__init__ | 工作区根目录 |
297
+ | `KITE_KERNEL_PORT` | Phase 1 拿到端口后 | Kernel 端口号 |
298
+ | `KITE_MODULE_DATA` | 启动模块时 | 模块数据目录 |
299
+ | `KITE_INSTANCE_SUFFIX` | Launcher.__init__ | 多实例后缀 |
300
+ | `KITE_CWD` | main.py 启动时 | 原始工作目录 |
301
+ | `KITE_DEBUG` | 用户设置 | 调试模式标志 |
302
+
303
+ ### 模块可用的环境变量
304
+
305
+ 模块进程启动时继承 Launcher 的环境变量。其中:
306
+
307
+ - `KITE_KERNEL_PORT` — 立即可用,模块可在冷启动阶段就读取
308
+ - `KITE_MODULE_DATA` — 每个模块不同,由 ProcessManager 设置
309
+ - Token — **不通过环境变量**,通过 stdin 传递
310
+
311
+ ## 模块端启动流程
312
+
313
+ ### FastAPI 模块(evol / web)
314
+
315
+ ```
316
+ Python 冷启动 + import 依赖库 ← 与 token 生成并行
317
+ → 读取 KITE_KERNEL_PORT(环境变量,立即可用)
318
+ → 绑定端口
319
+ → 创建 Server 对象(token="",占位)
320
+ → sys.stdin.readline() 阻塞等待 token ← 简单直接
321
+ → 解析 JSON,检查 error 字段
322
+ → 设置 server.token
323
+ → 启动 uvicorn
324
+ → FastAPI startup 事件:
325
+ → 连接 Kernel WS → 首条消息 auth
326
+ → 发布 module.ready
327
+ ```
328
+
329
+ **关键设计决策:** `readline()` 放在 `entry.py main()` 中,在创建 Server 之后、启动 uvicorn 之前。不放在 FastAPI startup 事件中(太"机巧",容易出错)。
330
+
331
+ 参考代码:`extensions/services/evol/entry.py:main()`
332
+
333
+ ### 轻量模块(watchdog / backup / model_service 等)
334
+
335
+ ```
336
+ Python 冷启动 + import
337
+ → 读取 KITE_KERNEL_PORT
338
+ → sys.stdin.readline() 等待 token
339
+ → 解析 JSON,检查 error
340
+ → 连接 Kernel WS → 首条消息 auth
341
+ → 注册 + 发布 module.ready
342
+ → 进入主循环
343
+ ```
344
+
345
+ ### 手动启动模式(计划中)
346
+
347
+ 当模块不通过 Launcher 启动(开发/调试场景),`sys.stdin.isatty()` 返回 `True`:
348
+
349
+ ```python
350
+ if sys.stdin.isatty():
351
+ # 手动启动模式
352
+ token = os.environ.get("KITE_MODULE_TOKEN", "")
353
+ if not token:
354
+ token = input("请输入配对码: ").strip()
355
+ else:
356
+ # Launcher 启动模式
357
+ line = sys.stdin.readline()
358
+ if not line:
359
+ sys.exit(1) # stdin 关闭
360
+ msg = json.loads(line)
361
+ if "error" in msg:
362
+ sys.exit(1) # Launcher 报告错误
363
+ token = msg.get("token", "")
364
+ ```
365
+
366
+ **配对码机制:** 配对码就是 token,由 Kernel 生成。手动启动时,用户需要从 Launcher 日志或 Web UI 获取配对码。
367
+
368
+ ### 当前实现状态
369
+
370
+ **注意:** 当前 evol/web 的实现是在 FastAPI startup 事件中通过 `asyncio.to_thread(sys.stdin.readline)` 读取 token,WS 认证仍使用 URL 参数。计划按本文档设计改造。
371
+
372
+ ## close_stdio 生命周期
373
+
374
+ ### 关闭时机
375
+
376
+ 模块就绪后(收到 `module.ready` 事件),Launcher 调用 `close_stdio(module_name)`。
377
+
378
+ ### 只关闭 stdin
379
+
380
+ `close_stdio()` **只关闭 stdin,不关闭 stdout**:
381
+
382
+ - **stdin 关闭原因:** module.ready 后不需要再向模块发送消息
383
+ - **stdout 保持原因:** stdout reader 线程需要继续转发模块日志
384
+ - **Windows 限制:** 在 Windows 上,如果 reader 线程正在 `readline()` 阻塞时关闭 stdout,会导致死锁。stdout 让其自然关闭(进程退出时)
385
+
386
+ 关键代码:`launcher/process_manager.py:close_stdio()`
387
+
388
+ ### stdout reader 线程生命周期
389
+
390
+ stdout reader 是 daemon 线程,生命周期跟随子进程:
391
+
392
+ ```
393
+ start_module()
394
+ → 创建 daemon thread: _read_stdout()
395
+ → 循环 proc.stdout.readline()
396
+ → 进程退出 → readline() 返回 b"" → 线程自然退出
397
+ ```
398
+
399
+ ## 错误处理
400
+
401
+ ### Token 生成超时
402
+
403
+ ```
404
+ Launcher 任务 C:
405
+ await asyncio.wait_for(_tokens_generated.wait(), timeout=10)
406
+ → 超时 → 发送错误消息到所有已启动模块
407
+ → {"error": "token_generation_timeout", "message": "..."}
408
+ → raise RuntimeError → Launcher 打印红色警告退出
409
+
410
+ 模块端:
411
+ readline() → 解析 JSON → 检查 "error" 字段
412
+ → 有 error → 打印错误 → sys.exit(1)
413
+ ```
414
+
415
+ ### Token 生成失败(RPC 错误)
416
+
417
+ ```
418
+ Launcher 任务 B:
419
+ _generate_module_tokens() RPC 返回 error
420
+ → 设置 _token_error 标志
421
+ → set _tokens_generated 事件
422
+
423
+ Launcher 任务 C:
424
+ 检测到 _token_error
425
+ → 向所有模块发送 {"error": "token_generation_failed", "message": "..."}
426
+ → 抛异常
427
+ ```
428
+
429
+ ### Launcher 异常退出
430
+
431
+ 如果 Launcher 进程退出(崩溃/被杀),stdin 管道断开:
432
+
433
+ ```
434
+ 模块端 readline() 返回空字符串 ""
435
+ → 检测到 stdin 关闭
436
+ → 打印错误日志
437
+ → sys.exit(1)
438
+ ```
439
+
440
+ ### 模块启动超时
441
+
442
+ 每个模块在 `module.md` 中配置 `launch.timeout`(默认 30s)。超时后的处理分两种场景:
443
+
444
+ **首次启动(system_startup):标记跳过,不阻塞系统**
445
+
446
+ - 不杀进程、不重试
447
+ - 标记 `_timeout_modules[name] = True`
448
+ - 继续走完 Phase 2,正常发 system.ready
449
+ - 理由:启动阶段不应因一个非核心模块卡住整个系统。Watchdog 上线后会接管监控
450
+
451
+ **运行时重启(Watchdog / 手动):杀掉 + 上报**
452
+
453
+ - 超时后杀掉进程
454
+ - 发布 `module.stopped`(exit_type: "timeout")
455
+ - 由 Watchdog 或用户决定是否再次重启
456
+ - 理由:运行时重启有明确期望,超时意味着出了问题,应快速失败
457
+
458
+ ### Kernel 连接失败
459
+
460
+ Launcher 连接 Kernel WS 失败时,指数退避重试(0.3s → 0.6s → ... → 5s),最多 10 次。认证失败(4001/4003)不重试,直接退出。
461
+
462
+ ## 关闭流程(三阶段)
463
+
464
+ 关闭触发方式:Ctrl+C、信号(SIGTERM/SIGINT)、按 q 键、RPC 调用 `launcher.shutdown`。
465
+
466
+ ### Phase 1: 关闭 Watchdog
467
+
468
+ **目的:** 防止 Watchdog 检测到其他模块退出后触发重启。
469
+
470
+ ```
471
+ 标记 desired_state = "stopped"
472
+ → _graceful_stop(watchdog, reason="system_shutdown")
473
+ → 串行等待完成
474
+ ```
475
+
476
+ ### Phase 2: 关闭其他模块
477
+
478
+ **并发关闭所有非 Kernel 模块:**
479
+
480
+ ```
481
+ 标记所有模块 desired_state = "stopped"
482
+ → asyncio.gather(*(_graceful_stop(name) for name in others))
483
+ ```
484
+
485
+ ### Phase 3: 关闭 Kernel
486
+
487
+ **最后关闭 Kernel,确保事件路由在 Phase 2 中仍可用:**
488
+
489
+ ```
490
+ _graceful_stop(kernel, reason="system_shutdown")
491
+ → 最终安全网: process_manager.stop_all()
492
+ ```
493
+
494
+ ### _graceful_stop 流程
495
+
496
+ ```
497
+ 发送 module.shutdown 事件
498
+ → 等待 shutdown.ack(3s)
499
+ → 等待 module.exiting(3s)
500
+ → 等待清理完成(cleanup_timeout,模块声明的清理时间)
501
+ → 发送 SIGTERM
502
+ → 等待退出(超时后 force kill)
503
+ → 发布 module.stopped 事件
504
+ ```
505
+
506
+ ### 安全网
507
+
508
+ - 20s 强制退出线程:如果正常关闭未在 20s 内完成,调用 `os._exit(1)`
509
+ - ESC 键:立即 `os._exit(0)`
510
+
511
+ ## 模块生命周期事件
512
+
513
+ ```
514
+ module.starting ← Launcher 发布(Phase 2 进入等待时)
515
+ module.ready ← 模块自己发布(初始化完成)
516
+ module.started ← Launcher 发布(确认就绪)
517
+ system.ready ← Launcher 发布(所有模块就绪)
518
+ module.exiting ← 模块发布(准备退出)
519
+ module.stopped ← Launcher 发布(确认停止)
520
+ module.shutdown ← Launcher 发布(请求模块关闭)
521
+ ```
522
+
523
+ **注意:** `module.starting` 不在 Phase 1 任务 C 中发布(此时 WS 可能未就绪),而是在 Phase 2 进入等待时发布。
524
+
525
+ ## 多实例支持
526
+
527
+ 同一工作目录可以运行多个 Launcher 实例:
528
+
529
+ - 第 1 个实例:`processes.json`, `latest.log`, `crashes.jsonl`
530
+ - 第 N 个实例:`processes~N.json`, `latest~N.log`, `crashes~N.jsonl`
531
+
532
+ 实例号分配:扫描 `processes*.json`,找到最小可用号(已退出的实例号可复用)。
533
+
534
+ ## 残留进程清理
535
+
536
+ ### 清理时机
537
+
538
+ Phase 1 完成后(Kernel 就绪后),执行本地 + 全局清理。
539
+
540
+ ### 清理逻辑
541
+
542
+ ```
543
+ 扫描 processes*.json
544
+ → 跳过自己的(launcher_pid == my_pid)
545
+ → 跳过活着的并行实例(launcher_pid alive)
546
+ → 死掉的 Launcher 的子进程 → 并行清理
547
+ 依赖顺序:Watchdog 先杀 → 中间模块并行杀 → Kernel 最后杀
548
+ 安全校验:PID 存活 + 命令行匹配(防止 PID 复用误杀)
549
+ ```
550
+
551
+ ## 参考文件索引
552
+
553
+ | 文件 | 说明 |
554
+ |------|------|
555
+ | `launcher/entry.py` | Launcher 主逻辑 |
556
+ | `launcher/process_manager.py` | 进程管理(stdin/stdout/生命周期) |
557
+ | `launcher/module_scanner.py` | 模块扫描 |
558
+ | `kernel/entry.py` | Kernel 入口(端口绑定、token 生成) |
559
+ | `kernel/server.py` | Kernel WebSocket 服务器 |
560
+ | `extensions/services/evol/entry.py` | Evol 模块入口 |
561
+ | `extensions/services/evol/server.py` | Evol FastAPI 服务器 |
562
+ | `extensions/services/web/entry.py` | Web 模块入口 |
563
+ | `extensions/services/web/server.py` | Web FastAPI 服务器 |
564
+ | `extensions/services/watchdog/entry.py` | Watchdog 模块入口 |
565
+ | `docs/启动优化方案.md` | 启动优化方案(并行冷启动) |
566
+ | `docs/优雅退出规范.md` | 关闭流程详细规范 |
567
+ | `docs/日志与异常处理规范.md` | 日志目录和格式规范 |