@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,745 @@
1
+ # Launcher 启动器文档
2
+
3
+ ## 1. 概述
4
+
5
+ Launcher 是 Kite 框架的入口和控制台,与 `main.py` 运行在同一进程中。它负责整个系统的生命周期管理:启动 Registry、扫描并启动模块、监控子进程状态、提供管理 API、处理优雅退出。
6
+
7
+ Launcher 的设计原则是**极简、极稳**——代码尽量少,崩溃概率尽量低,因为它是所有模块的父进程。
8
+
9
+ ## 2. 快速开始
10
+
11
+ ### 2.1 启动系统
12
+
13
+ ```bash
14
+ python main.py
15
+ ```
16
+
17
+ 启动后你会看到类似输出:
18
+
19
+ ```
20
+ [main] KITE_TOKEN generated (64 chars)
21
+ [launcher] Kite starting...
22
+ [launcher] Project root: /path/to/Kite
23
+ [launcher] Waiting for Registry to report its port...
24
+ [launcher] Registry is ready
25
+ [launcher] API server started on port 52341
26
+ [launcher] Registered self to Registry
27
+ [launcher] Found 3 module(s): event_hub, kernel, webchat
28
+ [launcher] Starting 3 enabled module(s)...
29
+ [launcher] Started event_hub (PID 12345)
30
+ [launcher] Started kernel (PID 12346)
31
+ [launcher] Started webchat (PID 12347)
32
+ [launcher] Entering monitor loop (press Ctrl+C or 'q' to exit)
33
+ ```
34
+
35
+ ### 2.2 退出系统
36
+
37
+ - **Linux/macOS**: `Ctrl+C` 或发送 `SIGTERM`
38
+ - **Windows**: 按 `q` 键或 `Ctrl+C`
39
+
40
+ 退出时 Launcher 会执行优雅退出流程(详见《优雅退出规范》):
41
+ 1. 广播 `module.shutdown` 事件(reason: `system_shutdown`)
42
+ 2. 并行等待各模块 ack + ready(总超时 10s)
43
+ 3. 超时后强杀未退出的进程
44
+ 4. 清空 `processes.json`
45
+ 5. 退出
46
+
47
+ ### 2.3 前置依赖
48
+
49
+ ```bash
50
+ pip install fastapi uvicorn httpx
51
+ ```
52
+
53
+ ## 3. 启动序列
54
+
55
+ `main.py` 做两件事:生成 `KITE_TOKEN`(`secrets.token_hex(32)`,64 字符),然后创建 `Launcher` 实例并调用 `run()`。
56
+
57
+ Launcher 采用 4-Phase 启动序列:
58
+
59
+ ```
60
+ main.py
61
+
62
+ ├─ 前置:_validate_core_modules()
63
+ │ 检查 core/registry/ 和 core/event_hub/ 存在且包含 entry.py(不通过则 FATAL)
64
+
65
+ ├─ 前置:cleanup_leftovers()
66
+ │ 读取 processes.json → 检查 PID 存活 + 命令行匹配 → 杀确认的遗留进程
67
+
68
+ ├─ Phase 1: _phase1_registry()
69
+ │ ├─ 启动 Registry 子进程,stdin 传入 {"token": "kite_token"}
70
+ │ ├─ 等待 stdout 结构化消息 {"kite":"port","port":12345}(6s 超时,超时 FATAL)
71
+ │ ├─ 写入 os.environ["KITE_REGISTRY_PORT"]
72
+ │ ├─ _start_api_thread():OS 分配端口,独立线程启动 Launcher FastAPI
73
+ │ └─ _register_self():POST /modules 注册 Launcher 的 API 地址
74
+
75
+ ├─ 扫描 + Token 注册(Phase 1 与 Phase 2 之间)
76
+ │ ├─ module_scanner.scan():遍历 core/ 和 extensions/ 下所有 module.md
77
+ │ └─ _register_module_tokens():为每个模块生成专属 token → POST /tokens
78
+
79
+ ├─ Phase 2: _phase2_event_hub()
80
+ │ ├─ 启动 Event Hub 子进程,stdin 第一行 {"token": "eh_token"}
81
+ │ ├─ stdin 第二行发送 {"kite":"launcher_ws_token","launcher_ws_token":"xxx"}
82
+ │ ├─ 等待 stdout 结构化消息 {"kite":"ws_endpoint","ws_endpoint":"ws://..."}(6s 超时)
83
+ │ ├─ Launcher 用 launcher_ws_token 连接 Event Hub WebSocket
84
+ │ ├─ Event Hub 验证 launcher_ws_token → 发送 module.ready 事件
85
+ │ ├─ Launcher 收到 module.ready → 发布 module.started → 断开 Event Hub stdio
86
+ │ └─ Event Hub 在 Launcher 连入后自动注册到 Registry
87
+
88
+ ├─ Phase 3: _phase3_registry_ready()
89
+ │ ├─ Registry 检测到 Event Hub 注册(含 metadata.ws_endpoint)
90
+ │ ├─ Registry 连接 Event Hub WebSocket
91
+ │ ├─ Registry 发送 module.ready 事件
92
+ │ └─ Launcher 收到 → 发布 module.started → 断开 Registry stdio
93
+
94
+ ├─ Phase 4: _phase4_start_modules()
95
+ │ ├─ 初始化 desired_state:enabled→running,manual/disabled→stopped
96
+ │ ├─ 自动启动被依赖的 manual 模块
97
+ │ └─ 按拓扑序(depends_on)逐个启动,每个模块走 _start_one_module 流程
98
+
99
+ └─ Post-startup
100
+ ├─ persist_records():子进程信息写入 processes.json
101
+ └─ _monitor_loop():每秒检查子进程状态,处理崩溃(详见第 6 节)
102
+ ```
103
+
104
+ **模块重启时**:生成新 token → 重新注册到 Registry → 通过 stdin 传给新进程。旧 token 自动失效。
105
+
106
+ **关键约束**:Registry 和 Event Hub 是串行启动的核心模块(Phase 1→2→3),必须在普通模块之前就绪。Phase 4 中其余模块按 `depends_on` 拓扑序启动,无依赖的模块可并行启动。模块间的运行时依赖通过 Registry 的服务发现机制自行解决。
107
+
108
+ ### 3.1 _register_self() 注册 payload
109
+
110
+ Launcher 向 Registry `POST /modules` 注册自身,使用 kite_token 认证:
111
+
112
+ ```json
113
+ {
114
+ "action": "register",
115
+ "module_id": "launcher",
116
+ "module_type": "infrastructure",
117
+ "name": "Launcher",
118
+ "base_url": "http://127.0.0.1:<api_port>",
119
+ "health_path": "/launcher/modules",
120
+ "events_publish": {
121
+ "module.started": {},
122
+ "module.stopped": {},
123
+ "module.state_changed": {}
124
+ },
125
+ "events_subscribe": [">"]
126
+ }
127
+ ```
128
+
129
+ Header: `Authorization: Bearer <kite_token>`
130
+
131
+ ## 4. 线程模型
132
+
133
+ Launcher 进程内有多个线程协作:
134
+
135
+ | 线程 | 职责 | 类型 |
136
+ |------|------|------|
137
+ | 主线程 | asyncio 事件循环:启动序列 + 监控循环 | 常驻 |
138
+ | API 线程 | 独立运行 uvicorn + FastAPI,提供 Launcher API | daemon |
139
+ | stdout 线程(每个子进程一个) | 逐行读取子进程 stdout,加 `[module_name]` 前缀输出到控制台 | daemon |
140
+ | 键盘监听线程(仅 Windows) | 轮询 `msvcrt.kbhit()`,检测 `q` 键或 Ctrl+C | daemon |
141
+
142
+ 为什么 API 在独立线程?主线程专注进程管理和监控循环,API 线程独立运行保证即使主线程阻塞,管理接口仍可响应。
143
+
144
+ ### 日志汇聚
145
+
146
+ 所有子进程的 stdout/stderr 被重定向到 Launcher 进程。每个子进程有一个 daemon 线程逐行读取输出,加上模块名前缀后打印:
147
+
148
+ ```
149
+ [registry] Server started on port 52340
150
+ [event_hub] WebSocket server ready on port 52341
151
+ [kernel] Connected to Event Hub
152
+ [webchat] Serving static files at http://127.0.0.1:52342
153
+ ```
154
+
155
+ 子进程本身没有控制台窗口(Windows 使用 `CREATE_NO_WINDOW` flag)。
156
+
157
+ ## 5. 模块扫描与发现
158
+
159
+ ### 5.1 发现源配置(Discovery)
160
+
161
+ 模块发现由 Launcher 的 `module.md` 中的 `discovery` 字段驱动。支持两种发现源类型,可配置多个,每个独立启用/禁用:
162
+
163
+ | 字段 | 说明 |
164
+ |------|------|
165
+ | `type` | `scan_dir`(扫描目录)或 `module_list`(模块列表文件) |
166
+ | `path` | 目录或文件路径(相对于项目根目录) |
167
+ | `enabled` | 是否启用(true/false),用开关控制而非删除 |
168
+ | `max_depth` | 仅 `scan_dir`,最大递归深度,默认 2 |
169
+
170
+ Launcher module.md 示例:
171
+
172
+ ```yaml
173
+ discovery:
174
+ root:
175
+ type: scan_dir
176
+ path: .
177
+ enabled: true
178
+ extra:
179
+ type: module_list
180
+ path: data/modules.txt
181
+ enabled: false
182
+ ```
183
+
184
+ **内置扫描**:`core/`(深度 1)和 `extensions/`(深度 2)始终自动扫描,无需配置。`discovery` 字段用于在此基础上添加额外的模块源。
185
+
186
+ **扫描规则**:
187
+ - `scan_dir`:递归扫描目录下的子目录(最多 `max_depth` 级),找到 `module.md` 即视为模块
188
+ - `module_list`:逐行读取文件,每行一个模块目录路径(支持 `#` 注释)
189
+ - Launcher 自身目录(`core/launcher`)始终跳过
190
+ - **模块名唯一**:以 `module.md` 中的 `name` 字段为准(非目录名),重名模块只加载先发现的,后续跳过并警告
191
+
192
+ 内置扫描覆盖范围:
193
+
194
+ ```
195
+ core/(内置,depth 1)
196
+ core/registry/module.md ← ✓
197
+ core/event_hub/module.md ← ✓
198
+ core/launcher/ ← 跳过(Launcher 自身)
199
+
200
+ extensions/(内置,depth 2)
201
+ extensions/services/watchdog/module.md ← ✓
202
+ ```
203
+
204
+ 额外 discovery 源配置的 `scan_dir` 按各自 `max_depth` 独立计算。
205
+
206
+ 多实例场景下,不同实例可通过各自 Launcher 的 `module.md` 指向不同的模块集合。
207
+
208
+ ### 5.2 module.md 格式
209
+
210
+ ```markdown
211
+ ---
212
+ name: event_hub
213
+ display_name: "Event Hub"
214
+ version: "1.0"
215
+ type: infrastructure
216
+ state: enabled
217
+ runtime: python
218
+ entry: entry.py
219
+ events:
220
+ - event.received
221
+ - event.forwarded
222
+ subscriptions: []
223
+ ---
224
+
225
+ # Event Hub
226
+
227
+ 模块的详细说明文档...
228
+ ```
229
+
230
+ frontmatter 字段说明:
231
+
232
+ | 字段 | 必填 | 默认值 | 说明 |
233
+ |------|------|--------|------|
234
+ | `name` | 是 | — | 模块唯一标识,用于进程管理和 API |
235
+ | `display_name` | 否 | 同 name | 显示名称 |
236
+ | `version` | 否 | `"1.0"` | 版本号 |
237
+ | `type` | 否 | `"infrastructure"` | 模块类型:infrastructure / channel / agent / service / kernel |
238
+ | `state` | 否 | `"enabled"` | 启动状态(见下文) |
239
+ | `runtime` | 否 | `"python"` | 运行时:python / node / binary |
240
+ | `entry` | 否 | `"entry.py"` | 入口文件名(相对于模块目录) |
241
+ | `events` | 否 | `[]` | 本模块会发出的事件类型 |
242
+ | `subscriptions` | 否 | `[]` | 本模块订阅的事件类型 |
243
+ | `preferred_port` | 否 | `0` | 首选端口号。0 表示由 OS 分配;非零则优先尝试该端口,不可用时回退 OS 分配 |
244
+ | `depends_on` | 否 | `[]` | 启动依赖的模块列表,用于拓扑排序 |
245
+ | `monitor` | 否 | `true` | Watchdog 是否监控此模块 |
246
+ | `launch` | 否 | (见下文) | 自定义启动参数,不填则完全保持默认行为 |
247
+
248
+ #### launch 配置块
249
+
250
+ `launch` 是可选的嵌套配置,用于自定义模块的启动方式。所有子字段均可选,不填则使用默认值:
251
+
252
+ ```yaml
253
+ launch:
254
+ cmd: ["python3.11", "-u", "main.py", "--mode", "prod"]
255
+ env:
256
+ MY_VAR: "value"
257
+ cwd: "./subdir"
258
+ boot_stdin: false
259
+ timeout: 60
260
+ ```
261
+
262
+ | 字段 | 类型 | 默认值 | 说明 |
263
+ |------|------|--------|------|
264
+ | `cmd` | `list[str]` | `[]`(用 runtime+entry) | 完整启动命令,非空时覆盖 `_build_cmd()` 的 runtime+entry 逻辑 |
265
+ | `env` | `dict` | `{}` | 额外环境变量,合并到进程 env(基础 env 始终包含 `PYTHONUTF8=1` 和 `PYTHONUNBUFFERED=1`) |
266
+ | `cwd` | `str` | `""`(用 module_dir) | 工作目录,相对路径基于 module_dir 解析 |
267
+ | `boot_stdin` | `bool` | `true` | 是否通过 stdin 传 boot_info JSON。设为 false 时模块需自行获取 token 和端口 |
268
+ | `timeout` | `int` | `30` | 等待 `module.ready` 事件的超时秒数 |
269
+
270
+ ### 5.3 模块三层状态模型
271
+
272
+ 每个模块有三层状态:
273
+
274
+ | 层 | 名称 | 值 | 谁写 | 存在哪 |
275
+ |----|------|---|------|--------|
276
+ | 配置状态 | `config_state` | enabled / manual / disabled | owner 修改 module.md | module.md |
277
+ | 期望状态 | `desired_state` | running / stopped | 其他模块通过 Launcher API 改变 | Launcher 内存 |
278
+ | 实际状态 | `actual_state` | running(PID) / stopped | Launcher 观测进程 | Launcher 内存 |
279
+
280
+ 初始化规则:
281
+ - enabled → desired_state 初始为 running
282
+ - manual → desired_state 初始为 stopped
283
+ - disabled → desired_state 固定为 stopped,不可改
284
+
285
+ core 模块(registry、event_hub、kernel)始终 enabled,不可设为 disabled。
286
+
287
+ ### 5.4 Polyglot 运行时
288
+
289
+ Launcher 根据 `runtime` 字段选择解释器:
290
+
291
+ ```python
292
+ # runtime: python
293
+ [sys.executable, "entry.py"]
294
+
295
+ # runtime: node
296
+ ["node", "entry.js"]
297
+
298
+ # runtime: binary
299
+ ["./entry"]
300
+ ```
301
+
302
+ 如果配置了 `launch.cmd`(非空列表),则直接使用该命令,跳过上述 runtime+entry 逻辑。这允许模块指定自定义解释器版本或额外启动参数。
303
+
304
+ 所有子进程统一通过 **stdin 管道**接收启动信息(一行 JSON,stdin 保持打开直到 module.ready 后断开),除非 `launch.boot_stdin` 设为 `false`:
305
+
306
+ ```json
307
+ {"token": "tok_abc..."}
308
+ ```
309
+
310
+ token 通过 stdin 传递,Registry 端口通过环境变量 `KITE_REGISTRY_PORT` 传递。模块从自己的 `module.md` 读取 `preferred_port` 来决定绑定端口。
311
+
312
+ ## 6. 进程监控与故障恢复
313
+
314
+ ### 6.1 监控循环
315
+
316
+ Launcher 进入监控循环后,每秒执行一次 `check_exited()`,非阻塞检查所有子进程是否退出。
317
+
318
+ ### 6.2 故障分级处理
319
+
320
+ | 场景 | 处理策略 |
321
+ |------|----------|
322
+ | core 模块崩溃(registry / event_hub / kernel) | 全量重启:stop_all → 重新执行完整启动序列 |
323
+ | 非 core 模块崩溃 | 记录日志,递增失败计数。由 Watchdog 模块通过 API 决定是否重启 |
324
+ | 同一模块连续失败 3 次 | 标记为 failed,不再自动重启 |
325
+ | 3 个以上模块 failed | Launcher 自身退出(整个 Kite 停止) |
326
+
327
+ ### 6.3 全量重启流程
328
+
329
+ 当 core 模块(Registry / Event Hub)崩溃时触发,按 Phase 1→2→3→4 完整重走:
330
+
331
+ ```
332
+ 1. 断开 Launcher 与 Event Hub 的 WebSocket 连接,取消心跳任务
333
+ 2. _graceful_shutdown_all() — 广播 module.shutdown,等待超时后强杀所有子进程
334
+ 3. 清空失败计数和模块 token
335
+ 4. 重新生成 kite_token(旧 token 全部作废)
336
+ 5. Phase 1:启动 Registry → stdout 拿 port → 写 KITE_REGISTRY_PORT → 启动 API → 注册自身
337
+ 6. 重新扫描模块 + 重新注册模块 token
338
+ 7. Phase 2:启动 Event Hub → stdin launcher_ws_token → stdout ws_endpoint → Launcher 连 WS → module.ready → 断开 stdio
339
+ 8. Phase 3:Event Hub 注册到 Registry → Registry 连 Event Hub WS → Registry module.ready → 断开 stdio
340
+ 9. Phase 4:按拓扑序启动其余 enabled 模块
341
+ 10. persist_records() + 恢复心跳 + 恢复监控循环
342
+ ```
343
+
344
+ 如果全量重启本身也失败,Launcher 退出。
345
+
346
+ ## 7. 遗留进程清理
347
+
348
+ 每次启动时,Launcher 首先检查上次是否有未正常退出的子进程。
349
+
350
+ ### 7.1 持久化记录
351
+
352
+ 所有子进程信息持久化在 `{KITE_INSTANCE_DIR}/launcher/state/processes.json`:
353
+
354
+ ```json
355
+ [
356
+ {
357
+ "name": "registry",
358
+ "pid": 12345,
359
+ "cmd": ["python", "/path/to/entry.py"],
360
+ "module_dir": "/path/to/core/registry",
361
+ "started_at": 1709020800.0
362
+ }
363
+ ]
364
+ ```
365
+
366
+ 注:boot_info(token)通过 stdin 管道传递,不出现在 cmd 中。Registry 端口通过环境变量 `KITE_REGISTRY_PORT` 传递。
367
+
368
+ ### 7.2 清理逻辑
369
+
370
+ ```
371
+ 读取 processes.json
372
+ → 对每条记录:
373
+ 1. 检查 PID 是否存活
374
+ - Linux/macOS: os.kill(pid, 0)
375
+ - Windows: tasklist /FI "PID eq {pid}"
376
+ 2. 如果存活,验证命令行匹配
377
+ - Linux: 读 /proc/{pid}/cmdline
378
+ - macOS: ps -p {pid} -o command=
379
+ - Windows: wmic process where ProcessId={pid} get CommandLine
380
+ 3. PID 存活 + 命令行匹配 → 确认是遗留进程,杀掉
381
+ 4. PID 不存在 或 命令行不匹配 → 跳过(PID 已被回收给其他进程)
382
+ → 清空 processes.json
383
+ ```
384
+
385
+ 命令行匹配是关键的安全措施——防止 PID 被操作系统回收后误杀无关进程。
386
+
387
+ ## 8. Launcher API
388
+
389
+ Launcher 在独立线程运行一个 FastAPI 服务,提供管理接口。其他模块(如 Watchdog)可通过这些接口管理模块生命周期。
390
+
391
+ ### 8.0 权限控制
392
+
393
+ **所有 `/launcher/*` 接口均需要认证**,包含两层安全机制:
394
+
395
+ 1. **IP 白名单**:仅允许 `127.0.0.1`、`::1`、`localhost` 访问,拒绝远程连接
396
+ - 非本地访问返回 `403 Forbidden`
397
+
398
+ 2. **Bearer Token 认证**:所有请求必须携带 `Authorization` 头
399
+ ```
400
+ Authorization: Bearer {KITE_TOKEN}
401
+ ```
402
+ - 缺少或格式错误返回 `401 Unauthorized: Missing or invalid Authorization header`
403
+ - Token 错误返回 `401 Unauthorized: Invalid token`
404
+
405
+ **示例请求**:
406
+ ```bash
407
+ curl -H "Authorization: Bearer abc123..." http://127.0.0.1:52341/launcher/modules
408
+ ```
409
+
410
+ ### 8.1 GET /launcher/modules
411
+
412
+ 列出所有已扫描的模块及其当前状态。
413
+
414
+ 请求:无参数
415
+
416
+ 响应示例:
417
+ ```json
418
+ [
419
+ {
420
+ "name": "event_hub",
421
+ "display_name": "Event Hub",
422
+ "type": "infrastructure",
423
+ "config_state": "enabled",
424
+ "desired_state": "running",
425
+ "actual_state": "running(12345)",
426
+ "pid": 12345,
427
+ "monitor": true
428
+ },
429
+ {
430
+ "name": "webchat",
431
+ "display_name": "WebChat",
432
+ "type": "channel",
433
+ "config_state": "manual",
434
+ "desired_state": "stopped",
435
+ "actual_state": "stopped",
436
+ "pid": null,
437
+ "monitor": true
438
+ }
439
+ ]
440
+ ```
441
+
442
+ ### 8.2 POST /launcher/modules/{name}/start
443
+
444
+ 启动指定模块。模块必须处于 `enabled` 或 `manual` 状态。
445
+
446
+ 请求:无 body
447
+
448
+ 响应:
449
+ ```json
450
+ {"status": "started", "name": "webchat"}
451
+ ```
452
+
453
+ 错误码:
454
+ - `404` — 模块不存在
455
+ - `403` — 模块处于 disabled 状态
456
+ - `500` — 启动失败
457
+
458
+ ### 8.3 POST /launcher/modules/{name}/stop
459
+
460
+ 停止指定模块。通过优雅退出流程停止(详见《优雅退出规范》)。
461
+
462
+ 请求 body(可选):
463
+ ```json
464
+ {"reason": "stop_requested"}
465
+ ```
466
+
467
+ `reason` 取值:`stop_requested`(默认)、`hot_update`、`restart`、`resource_critical`
468
+
469
+ 响应:
470
+ ```json
471
+ {"status": "stopped", "name": "webchat"}
472
+ ```
473
+
474
+ 错误码:
475
+ - `404` — 模块不存在
476
+
477
+ ### 8.4 POST /launcher/modules/{name}/restart
478
+
479
+ 重启指定模块(stop + start)。
480
+
481
+ 请求 body(可选):
482
+ ```json
483
+ {"reason": "restart"}
484
+ ```
485
+
486
+ 响应:
487
+ ```json
488
+ {"status": "restarted", "name": "webchat"}
489
+ ```
490
+
491
+ 错误码:
492
+ - `404` — 模块不存在
493
+ - `403` — 模块处于 disabled 状态
494
+
495
+ ### 8.5 POST /launcher/rescan
496
+
497
+ 重新扫描模块目录,发现新增或移除的模块。不影响已运行的模块。
498
+
499
+ 请求:无 body
500
+
501
+ 响应:
502
+ ```json
503
+ {"added": ["new_module"], "removed": ["old_module"], "total": 5}
504
+ ```
505
+
506
+ ### 8.6 PUT /launcher/modules/{name}/state
507
+
508
+ 修改模块的 state 字段,同时写入该模块的 `module.md` 文件。
509
+
510
+ 请求 body:
511
+ ```json
512
+ {"state": "manual"}
513
+ ```
514
+
515
+ 响应:
516
+ ```json
517
+ {
518
+ "name": "webchat",
519
+ "old_state": "enabled",
520
+ "new_state": "manual"
521
+ }
522
+ ```
523
+
524
+ 错误码:
525
+ - `404` — 模块不存在
526
+ - `400` — state 值无效(必须是 enabled / manual / disabled)
527
+ - `403` — core 模块不允许设为 disabled
528
+
529
+ ### 8.7 POST /launcher/shutdown
530
+
531
+ 关闭整个 Kite 系统,等价于 `Ctrl+C`。触发完整的优雅退出流程。
532
+
533
+ 请求 body(可选):
534
+ ```json
535
+ {"reason": "api_request"}
536
+ ```
537
+
538
+ 响应:
539
+ ```json
540
+ {"status": "shutting_down", "reason": "api_request"}
541
+ ```
542
+
543
+ **注意**:
544
+ - 此接口会立即触发系统关闭,Launcher 进程将在优雅退出完成后终止
545
+ - 响应返回后,连接可能会立即断开
546
+ - 适用场景:远程管理、自动化部署、容器编排
547
+
548
+ ## 9. 跨平台行为
549
+
550
+ Launcher 在 Windows、Linux 和 macOS 上行为一致,但底层实现有差异:
551
+
552
+ | 功能 | Linux | macOS | Windows |
553
+ |------|-------|-------|---------|
554
+ | 进程存活检查 | `os.kill(pid, 0)` | `os.kill(pid, 0)` | `tasklist /FI "PID eq {pid}"` |
555
+ | 命令行匹配 | 读 `/proc/{pid}/cmdline` | `ps -p {pid} -o command=` | `wmic process ... get CommandLine` |
556
+ | 终止进程 | `SIGTERM` → `SIGKILL` | `SIGTERM` → `SIGKILL` | `proc.terminate()` → `proc.kill()` |
557
+ | 强杀进程 | `os.kill(pid, SIGKILL)` | `os.kill(pid, SIGKILL)` | `taskkill /F /PID {pid}` |
558
+ | 子进程窗口 | 无(默认行为) | 无(默认行为) | `CREATE_NO_WINDOW` flag |
559
+ | 退出信号 | `SIGTERM` / `SIGINT` handler | `SIGTERM` / `SIGINT` handler | daemon 线程轮询 `msvcrt.kbhit()` |
560
+ | 最终退出 | 正常 return | 正常 return | `os._exit(0)`(避免 Windows 线程清理卡死) |
561
+
562
+ macOS 与 Linux 的主要区别在于命令行匹配:macOS 没有 `/proc` 文件系统,改用 `ps` 命令获取进程命令行。其余行为与 Linux 一致。
563
+
564
+ ## 10. 端口分配
565
+
566
+ 所有模块默认使用 **OS 动态分配端口**(bind port 0),不预设固定端口号:
567
+
568
+ ```
569
+ Registry: OS 分配 → 启动后通过 stdout 回传端口 → Launcher 写入 KITE_REGISTRY_PORT 环境变量
570
+ Launcher API: OS 分配(_get_free_port(),bind port 0)
571
+ 其他模块: OS 分配(各自绑定后向 Registry 注册 base_url)
572
+ ```
573
+
574
+ **Registry 端口发现流程**:
575
+ 1. Launcher 启动 Registry 子进程(不指定端口)
576
+ 2. Registry 绑定 port 0,OS 分配实际端口
577
+ 3. Registry 通过 stdout 发送端口消息
578
+ 4. Launcher 读取 stdout 获取端口(6s 超时)
579
+ 5. Launcher 写入 `KITE_REGISTRY_PORT` 环境变量,后续子进程自动继承
580
+
581
+ **Launcher API 端口分配**:`_get_free_port()` bind port 0 获取 OS 分配的端口,立即用于 uvicorn。
582
+
583
+ `module.md` 中可选声明 `preferred_port`,模块自行从 module.md 读取,模块自行尝试绑定,绑定失败则回退 OS 分配。
584
+
585
+ ## 11. 安全机制
586
+
587
+ ### KITE_TOKEN + Per-Module Token + stdin 管道
588
+
589
+ 系统使用两层 token 实现身份认证,所有 token 通过 stdin pipe 传递(不使用环境变量)。
590
+
591
+ **第一层:KITE_TOKEN(全局)**
592
+
593
+ `main.py` 每次启动生成一个随机 token(`secrets.token_hex(32)`,64 字符)。Launcher 启动 Registry 时,通过 stdin 将此 token 写入 Registry 子进程。只有 Launcher 持有此 token,用于调用 Registry 的特权接口(如 `POST /tokens`)。
594
+
595
+ **第二层:Per-module Token(模块级)**
596
+
597
+ 模块扫描完成后,Launcher 为每个模块生成独立的 token(同样 64 字符 hex),通过 `POST /tokens` 批量注册到 Registry。启动模块时,Launcher 通过 stdin 将该模块自己的 token 传给子进程。模块用自己的 token 向 Registry 注册,Registry 验证 token 并识别调用者身份。
598
+
599
+ **stdin boot_info 格式**
600
+
601
+ Launcher 启动子进程时,向其 stdin 写入一行 JSON(stdin 保持打开直到 module.ready 后断开):
602
+
603
+ ```json
604
+ {"token": "<module_token>"}
605
+ ```
606
+
607
+ 子进程启动后从 stdin 读取这行 JSON,获取自己的 token。Registry 端口从环境变量 `KITE_REGISTRY_PORT` 读取,首选端口从自己的 `module.md` 读取。
608
+
609
+ **安全特性**:
610
+ - 每个模块只知道自己的 token,无法冒充其他模块
611
+ - kite_token 只有 Launcher 和 Registry 知道,模块无法调用特权接口
612
+ - token 每次启动都不同,不持久化
613
+ - 只在本机 `127.0.0.1` 通信,不暴露到网络
614
+ - token 通过 stdin pipe 传递,不出现在进程命令行或环境变量中
615
+ - 模块重启时生成新 token,旧 token 自动失效
616
+
617
+ ## 12. 错误处理
618
+
619
+ | 场景 | 处理 |
620
+ |------|------|
621
+ | core 模块目录不存在(registry / event_hub) | `sys.exit(1)`,FATAL(启动前校验) |
622
+ | core 模块 module.md 缺失或解析失败 | `sys.exit(1)`,FATAL(启动前校验) |
623
+ | Registry 启动失败 | 抛 `RuntimeError`,Launcher 退出 |
624
+ | Registry 6s 内未回报端口 | 抛 `RuntimeError`,Launcher 退出 |
625
+ | Event Hub 6s 内未回报 ws_endpoint | 抛 `RuntimeError`,Launcher 退出 |
626
+ | Registry / Event Hub 运行中崩溃 | core 模块崩溃 → 全量重启 |
627
+ | 普通模块 module.md 解析失败 | 跳过该模块,打印 WARNING,继续扫描 |
628
+ | module.md 缺少 name 字段 | 跳过该模块,打印 WARNING |
629
+ | processes.json 损坏 | 跳过遗留清理,打印 WARNING |
630
+ | 端口全部被占用 | 抛 `RuntimeError`,Launcher 退出 |
631
+ | 子进程启动失败 | 打印 ERROR,返回 False,不影响其他模块 |
632
+ | Launcher 向 Registry 注册失败 | 打印 WARNING,继续运行(非致命) |
633
+
634
+ ## 13. 文件结构
635
+
636
+ ```
637
+ core/launcher/
638
+ ├── entry.py ← Launcher 类主逻辑(~900 行)
639
+ ├── process_manager.py ← 子进程生命周期管理(~330 行)
640
+ ├── module_scanner.py ← 扫描 module.md、解析 frontmatter(~170 行)
641
+ ├── module.md ← Launcher 自身的模块描述
642
+ └── __init__.py
643
+
644
+ 运行时状态文件(自动生成):
645
+ {KITE_INSTANCE_DIR}/launcher/state/
646
+ ├── processes.json ← 子进程记录(每次启动覆盖)
647
+ └── lifecycle.jsonl ← 启动/停止日志(每次启动清空)
648
+ ```
649
+
650
+ ## 14. 核心类参考
651
+
652
+ ### 14.1 Launcher(entry.py)
653
+
654
+ 系统入口类,协调所有组件。
655
+
656
+ | 属性 | 类型 | 说明 |
657
+ |------|------|------|
658
+ | `kite_token` | `str` | 本次启动的全局认证 token(Launcher 信任根) |
659
+ | `_module_tokens` | `dict[str, str]` | 各模块专属 token 映射(module_name → token) |
660
+ | `project_root` | `str` | Kite 项目根目录绝对路径(即 `KITE_PROJECT` 环境变量) |
661
+ | `registry_port` | `int` | Registry 实际绑定的端口 |
662
+ | `api_port` | `int` | Launcher API 实际绑定的端口 |
663
+ | `modules` | `dict[str, ModuleInfo]` | 扫描到的所有模块 |
664
+ | `_desired_states` | `dict[str, str]` | 各模块期望状态("running" / "stopped") |
665
+ | `process_manager` | `ProcessManager` | 子进程管理器 |
666
+ | `module_scanner` | `ModuleScanner` | 模块扫描器 |
667
+
668
+ | 方法 | 说明 |
669
+ |------|------|
670
+ | `run()` | 同步入口,设置信号处理,运行 asyncio 主循环 |
671
+ | `_async_main()` | 完整启动序列(11 步) |
672
+ | `_start_registry()` | 启动 Registry 子进程并等待就绪(stdout port 消息) |
673
+ | `_register_self()` | 用 kite_token 向 Registry 注册 Launcher |
674
+ | `_register_module_tokens()` | 为各模块生成 token 并注册映射表到 Registry |
675
+ | `_start_enabled_modules()` | 按拓扑序启动所有 desired_state=running 的模块(stdin 传 token) |
676
+ | `_start_one_module(info)` | 启动单个模块:发布 starting 事件 → 启动进程 → 等待 ready 事件 |
677
+ | `_topo_sort(modules)` | 按 depends_on 拓扑排序,检测循环依赖 |
678
+ | `_start_api_thread()` | 在独立线程启动 API 服务器 |
679
+ | `_connect_event_hub()` | 发现 Event Hub WebSocket 端点并启动后台客户端 |
680
+ | `_monitor_loop()` | 每秒检查子进程状态 |
681
+ | `_graceful_stop(name, reason, timeout)` | 优雅停止:发 shutdown 事件 → 等 ack → 等 ready → kill |
682
+ | `_graceful_shutdown_all()` | 广播 shutdown 事件到所有运行中模块 |
683
+ | `_full_restart()` | core 崩溃时的全量重启 |
684
+ | `_final_cleanup()` | 退出时清理所有进程 |
685
+ | `_get_free_port()` | 获取 OS 分配的可用端口(bind port 0) |
686
+
687
+ ### 14.2 ProcessManager(process_manager.py)
688
+
689
+ 子进程生命周期管理器。
690
+
691
+ | 方法 | 说明 |
692
+ |------|------|
693
+ | `cleanup_leftovers()` | 读 processes.json,杀确认的遗留进程 |
694
+ | `start_module(info, boot_info)` | 根据 runtime 构建命令,启动子进程,通过 stdin 写入 boot_info JSON,启动 stdout 读取线程 |
695
+ | `stop_module(name, timeout=5)` | 底层停止:terminate → wait → 超时 force kill。Launcher 层通过 `_graceful_stop(name, reason, timeout)` 封装,先发 shutdown 事件等 ack/ready 再调用此方法 |
696
+ | `stop_all(timeout=10)` | 批量 terminate → 等待 → 强杀未退出的 |
697
+ | `persist_records()` | 写 processes.json |
698
+ | `check_exited()` | 非阻塞检查已退出的子进程,返回 `[(name, returncode)]` |
699
+ | `is_running(name)` | 检查模块是否在运行 |
700
+ | `get_record(name)` | 获取模块的 ProcessRecord |
701
+
702
+ ### 14.3 ModuleInfo(module_scanner.py)
703
+
704
+ 模块信息数据类,从 module.md frontmatter 解析而来。
705
+
706
+ | 字段 | 类型 | 说明 |
707
+ |------|------|------|
708
+ | `name` | `str` | 模块唯一标识 |
709
+ | `display_name` | `str` | 显示名称 |
710
+ | `version` | `str` | 版本号 |
711
+ | `type` | `str` | 模块类型 |
712
+ | `state` | `str` | 配置状态(config_state) |
713
+ | `runtime` | `str` | 运行时(python / node / binary) |
714
+ | `entry` | `str` | 入口文件名 |
715
+ | `events` | `list` | 发出的事件类型 |
716
+ | `subscriptions` | `list` | 订阅的事件类型 |
717
+ | `preferred_port` | `int` | 首选端口号(0 = OS 分配) |
718
+ | `depends_on` | `list` | 启动依赖的模块名列表 |
719
+ | `monitor` | `bool` | Watchdog 是否监控此模块 |
720
+ | `module_dir` | `str` | 模块目录绝对路径 |
721
+ | `launch` | `LaunchConfig` | 启动配置(cmd / env / cwd / boot_stdin / timeout) |
722
+
723
+ 方法:`is_core(project_root)` — 判断是否为 core 模块(模块目录在 `{KITE_PROJECT}/core/` 下)。(module_scanner.py)
724
+
725
+ | 方法 | 说明 |
726
+ |------|------|
727
+ | `scan()` | 遍历 core/ 和 extensions/,返回 `dict[name, ModuleInfo]` |
728
+
729
+ frontmatter 解析器是内置的轻量实现(`_parse_frontmatter`),不依赖 `python-frontmatter` 库。支持:
730
+ - 简单 key-value(`name: xxx`)
731
+ - 列表(`- item` 缩进格式)
732
+ - 空列表(`[]` 内联格式)
733
+ - 引号值(自动去除)
734
+
735
+ ### 14.5 ProcessRecord(process_manager.py)
736
+
737
+ 子进程记录数据类,持久化到 processes.json。
738
+
739
+ | 字段 | 类型 | 说明 |
740
+ |------|------|------|
741
+ | `name` | `str` | 模块名 |
742
+ | `pid` | `int` | 进程 ID |
743
+ | `cmd` | `list` | 启动命令(用于遗留清理时的命令行匹配) |
744
+ | `module_dir` | `str` | 模块目录 |
745
+ | `started_at` | `float` | 启动时间戳 |