@agentunion/kite 1.5.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (574) hide show
  1. package/.claude/skills/kite/checklists/feature-checklist.md +496 -0
  2. package/.claude/skills/kite/references/event-patterns.md +180 -0
  3. package/.claude/skills/kite/references/health-check.md +202 -0
  4. package/.claude/skills/kite/references/http-service.md +199 -0
  5. package/.claude/skills/kite/references/module-md-spec.md +172 -0
  6. package/.claude/skills/kite/references/multi-connection.md +147 -0
  7. package/.claude/skills/kite/references/rpc-patterns.md +199 -0
  8. package/.claude/skills/kite/references/shutdown-sequence.md +146 -0
  9. package/.claude/skills/kite/references/stdin-protocol.md +147 -0
  10. package/.claude/skills/kite/references/test-center-integration.md +178 -0
  11. package/.claude/skills/kite/references/ws-lifecycle.md +301 -0
  12. package/.claude/skills/kite/skill.md +272 -0
  13. package/.claude/skills/kite/templates/go/README.md +20 -0
  14. package/.claude/skills/kite/templates/node/entry.js +134 -0
  15. package/.claude/skills/kite/templates/node/module.md +16 -0
  16. package/.claude/skills/kite/templates/node/server.js +351 -0
  17. package/.claude/skills/kite/templates/node/server_http.js +90 -0
  18. package/.claude/skills/kite/templates/python/entry.py +425 -0
  19. package/.claude/skills/kite/templates/python/module.md +26 -0
  20. package/.claude/skills/kite/templates/python/server.py +447 -0
  21. package/.claude/skills/kite/templates/python/server_http.py +433 -0
  22. package/cli.js +38 -4
  23. package/core/env_checker.py +96 -0
  24. package/docs/05-/347/237/255/344/277/241/350/256/244/350/257/201/344/270/216/347/224/250/346/210/267/344/277/241/346/201/257/346/216/245/345/217/243/346/226/207/346/241/243.md +507 -0
  25. package/docs/ACP/345/215/217/350/256/256/345/205/274/345/256/271/346/226/271/346/241/210.md +138 -0
  26. package/docs/CI/344/270/216AI/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/346/226/271/346/241/210.md +75 -0
  27. package/docs/CLI/345/274/200/345/217/221/350/256/241/345/210/222.md +595 -0
  28. package/docs/ClaudeCode/350/277/234/347/250/213/345/215/217/344/275/234/347/263/273/347/273/237-/346/212/200/346/234/257/350/257/204/344/274/260.md +535 -0
  29. package/docs/ClaudeCode/350/277/234/347/250/213/345/215/217/344/275/234/347/263/273/347/273/237/350/256/276/350/256/241.md +631 -0
  30. package/docs/Evol-App/344/275/277/347/224/250KernelClient/346/224/271/351/200/240/345/256/214/346/210/220.md +342 -0
  31. package/docs/Evol/346/216/247/345/210/266/345/217/260/346/217/222/344/273/266/345/214/226/346/236/266/346/236/204/346/246/202/350/246/201.md +604 -0
  32. package/docs/Evol/346/216/247/345/210/266/345/217/260/346/217/222/344/273/266/345/214/226/346/236/266/346/236/204/350/256/276/350/256/241.md +1708 -0
  33. package/docs/Evol/346/250/241/345/235/227/350/256/276/350/256/241/346/226/271/346/241/210.md +1154 -0
  34. package/docs/Evol/351/241/265/351/235/242/346/217/222/344/273/266/345/214/226-Evol/346/250/241/345/235/227/345/256/236/346/226/275/346/214/207/345/215/227.md +403 -0
  35. package/docs/Evol/351/241/265/351/235/242/346/217/222/344/273/266/345/214/226-/345/244/226/351/203/250/346/250/241/345/235/227/346/216/245/345/205/245/346/214/207/345/215/227.md +468 -0
  36. package/docs/HTTP-RPC/350/277/201/347/247/273/345/210/260WebSocket/350/256/241/345/210/222.md +318 -0
  37. package/docs/INDEX.md +388 -0
  38. package/docs/KITE_DOCS_GUIDE.md +33 -0
  39. package/docs/Kernel-Client-Kite-Token/346/224/257/346/214/201/345/256/236/346/226/275/345/256/214/346/210/220.md +330 -0
  40. package/docs/Kernel/344/270/273/345/212/250Ping/346/234/272/345/210/266-/346/255/243/347/241/256/345/256/236/347/216/260.md +235 -0
  41. package/docs/Kernel/344/270/273/345/212/250Ping/346/234/272/345/210/266/345/256/236/346/226/275/346/200/273/347/273/223.md +204 -0
  42. package/docs/Kite/345/256/211/350/243/205/351/227/256/351/242/230/350/247/243/345/206/263/346/226/271/346/241/210.md +362 -0
  43. package/docs/Kite/346/216/247/345/210/266/345/217/260/346/217/222/344/273/266/345/214/226/346/236/266/346/236/204/350/256/276/350/256/241-/347/273/210/346/236/201/347/233/256/346/240/207.md +721 -0
  44. package/docs/Kite/346/216/247/345/210/266/345/217/260/347/273/237/344/270/200WebSocket/346/224/271/351/200/240/346/226/271/346/241/210.md +821 -0
  45. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/01-/346/241/206/346/236/266/345/256/232/344/275/215.md +12 -0
  46. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/02-/346/240/270/345/277/203/346/246/202/345/277/265.md +341 -0
  47. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/03-/347/263/273/347/273/237/346/236/266/346/236/204.md +257 -0
  48. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/04-/346/250/241/345/235/227/350/247/204/350/214/203.md +263 -0
  49. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/05-/346/240/270/345/277/203/346/265/201/347/250/213-/346/226/260/347/211/210.md +267 -0
  50. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/05-/346/240/270/345/277/203/346/265/201/347/250/213.md +149 -0
  51. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/06-/347/233/256/345/275/225/347/273/223/346/236/204.md +231 -0
  52. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/07-/346/225/260/346/215/256/346/250/241/345/236/213.md +68 -0
  53. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/08-/346/211/251/345/261/225/346/200/247.md +34 -0
  54. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/09-/344/270/216/345/205/267/344/275/223/345/272/224/347/224/250/347/232/204/345/205/263/347/263/273.md +22 -0
  55. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/README.md +46 -0
  56. package/docs/Kite/347/263/273/347/273/237/345/220/257/345/212/250/346/265/201/347/250/213.md +567 -0
  57. package/docs/Launcher/345/220/257/345/212/250/345/231/250/346/226/207/346/241/243.md +745 -0
  58. package/docs/Polyglot/350/277/220/350/241/214/346/227/266/344/270/216Clawdbot/345/205/274/345/256/271/346/200/247/350/256/276/350/256/241.md +321 -0
  59. package/docs/Redis/344/270/216/346/250/241/345/235/227/345/244/232/345/256/236/344/276/213/346/226/271/346/241/210.md +438 -0
  60. package/docs/Relay-Kite-Token/350/256/244/350/257/201/345/256/236/346/226/275/345/256/214/346/210/220.md +178 -0
  61. package/docs/Relay-Token/346/235/203/351/231/220/351/205/215/347/275/256/351/252/214/350/257/201.md +113 -0
  62. package/docs/Watchdog/345/201/245/345/272/267/346/243/200/346/237/245/344/270/216WebSocket-Ping/346/234/272/345/210/266/345/210/206/346/236/220.md +367 -0
  63. package/docs/Watchdog/350/265/204/346/272/220/347/233/221/346/216/247/347/255/226/347/225/245.md +92 -0
  64. package/docs/WebSocket/346/216/245/346/224/266/345/276/252/347/216/257/346/255/273/351/224/201/351/230/262/350/214/203/350/247/204/350/214/203.md +357 -0
  65. package/docs/WebSocket/350/277/236/346/216/245/351/237/247/346/200/247/344/270/216/351/207/215/350/277/236/346/234/272/345/210/266/345/256/214/346/225/264/346/226/271/346/241/210.md +531 -0
  66. package/docs/WebSocket/350/277/236/346/216/245/351/237/247/346/200/247/346/226/271/346/241/210.md +169 -0
  67. package/docs/WebSocket/351/207/215/350/277/236/346/234/272/345/210/266/346/265/213/350/257/225/346/212/245/345/221/212.md +169 -0
  68. package/docs/WebSocket/351/207/215/350/277/236/351/200/200/351/201/277/346/234/272/345/210/266/346/226/271/346/241/210.md +394 -0
  69. package/docs/Web/346/250/241/345/235/227/344/270/216Evol/346/250/241/345/235/227/351/207/215/346/236/204/345/210/206/346/236/220.md +521 -0
  70. package/docs/audit-api-guide.md +68 -0
  71. package/docs/audit-module-design.md +315 -0
  72. package/docs/audit-module-implementation-summary.md +149 -0
  73. package/docs/llm-context-design.md +52 -0
  74. package/docs/llm-test-enhancement-plan.md +970 -0
  75. package/docs/logs-api-guide.md +42 -0
  76. package/docs/npm/345/214/205Python/347/216/257/345/242/203/347/256/241/347/220/206/346/226/271/346/241/210.md +302 -0
  77. package/docs/npm/345/217/221/345/270/203/344/270/216CLI/344/275/277/347/224/250/346/214/207/345/215/227.md +245 -0
  78. package/docs/stdio/344/270/216/347/253/257/345/217/243/345/217/221/347/216/260/351/207/215/346/236/204.md +480 -0
  79. package/docs/web/346/250/241/345/235/227/344/270/255/350/275/254/346/234/215/345/212/241/350/256/276/350/256/241/346/226/271/346/241/210.md +449 -0
  80. package/docs//344/272/213/344/273/266/345/244/204/347/220/206/346/234/272/345/210/266.md +388 -0
  81. package/docs//344/272/213/344/273/266/345/244/204/347/220/206/350/247/204/350/214/203.md +113 -0
  82. package/docs//344/272/213/344/273/266/350/256/242/351/230/205/351/200/232/351/205/215/347/254/246/350/247/204/350/214/203.md +256 -0
  83. package/docs//344/272/213/344/273/266/351/230/237/345/210/227/345/274/271/346/200/247/347/256/241/347/220/206.md +449 -0
  84. package/docs//344/272/244/344/272/222/345/274/217/347/273/210/347/253/257/346/216/247/345/210/266/346/226/271/346/241/210.md +301 -0
  85. package/docs//344/273/243/347/220/206/345/220/257/345/212/250/345/231/250/344/270/216/345/256/271/345/231/250/345/214/226.md +140 -0
  86. package/docs//344/273/243/347/240/201/347/273/237/350/256/241/345/267/245/345/205/267/344/275/277/347/224/250/350/257/264/346/230/216.md +217 -0
  87. package/docs//344/274/230/351/233/205/351/200/200/345/207/272/350/247/204/350/214/203.md +362 -0
  88. package/docs//344/276/235/350/265/226/347/256/241/347/220/206/350/257/264/346/230/216.md +141 -0
  89. package/docs//344/277/256/345/244/215/346/235/203/351/231/220/351/227/256/351/242/230-evol-RPC/346/235/203/351/231/220.md +268 -0
  90. package/docs//345/210/240/351/231/244kernel-client-example/345/256/214/346/210/220.md +309 -0
  91. package/docs//345/210/240/351/231/244ws-management/345/256/214/346/210/220.md +418 -0
  92. package/docs//345/220/257/345/212/250/344/274/230/345/214/226/346/226/271/346/241/210.md +522 -0
  93. package/docs//345/220/257/345/212/250/344/276/235/350/265/226/344/270/216/346/216/222/345/272/217.md +105 -0
  94. package/docs//345/256/211/350/243/205/350/204/232/346/234/254/345/274/200/345/217/221/346/226/207/346/241/243.md +643 -0
  95. package/docs//345/256/214/346/225/264/345/220/257/345/212/250/346/265/201/347/250/213/350/256/276/350/256/241.md +452 -0
  96. package/docs//345/256/236/347/216/260/350/247/204/345/210/222.md +195 -0
  97. package/docs//345/277/203/350/267/263/346/234/272/345/210/266/351/207/215/346/236/204/346/200/273/347/273/223.md +166 -0
  98. package/docs//346/217/241/346/211/213/350/256/244/350/257/201/346/226/271/346/241/210-/345/256/211/345/205/250/345/256/241/346/237/245.md +176 -0
  99. package/docs//346/217/241/346/211/213/350/256/244/350/257/201/346/226/271/346/241/210.md +908 -0
  100. package/docs//346/226/207/346/241/243/346/233/264/346/226/260/346/270/205/345/215/225.md +83 -0
  101. package/docs//346/227/245/345/277/227/344/270/216/345/274/202/345/270/270/345/244/204/347/220/206/350/247/204/350/214/203.md +829 -0
  102. package/docs//346/227/245/345/277/227/350/260/203/350/257/225/345/256/236/346/210/230/346/214/207/345/215/227.md +25 -0
  103. package/docs//346/236/266/346/236/204/345/200/237/351/211/264/346/214/207/345/215/227.md +977 -0
  104. package/docs//346/236/266/346/236/204/346/224/271/351/200/240-/345/256/214/346/210/220/346/200/273/347/273/223.md +440 -0
  105. package/docs//346/236/266/346/236/204/347/216/260/347/212/266/344/270/216/347/273/210/346/236/201/347/233/256/346/240/207/345/257/271/346/257/224/345/210/206/346/236/220.md +508 -0
  106. package/docs//346/250/241/345/235/227/345/244/232/350/277/236/346/216/245/346/216/247/345/210/266/347/255/226/347/225/245.md +220 -0
  107. package/docs//346/250/241/345/235/227/345/256/211/350/243/205/346/234/272/345/210/266/350/256/276/350/256/241.md +500 -0
  108. package/docs//346/250/241/345/235/227/345/274/200/345/217/221/346/214/207/345/215/227.md +1824 -0
  109. package/docs//346/250/241/345/235/227/347/203/255/346/233/264/346/226/260.md +89 -0
  110. package/docs//346/250/241/345/235/227/350/277/234/347/250/213/351/203/250/347/275/262/345/274/200/345/217/221/350/247/204/350/214/203.md +460 -0
  111. package/docs//346/250/241/345/235/227/351/200/200/345/207/272/346/234/272/345/210/266/345/256/214/346/225/264/346/226/271/346/241/210.md +303 -0
  112. package/docs//346/250/241/345/235/227/351/205/215/347/275/256/345/212/240/350/275/275/344/270/216/347/203/255/351/207/215/350/275/275/350/247/204/350/214/203.md +369 -0
  113. package/docs//346/265/213/350/257/225/344/270/255/345/277/203/346/267/273/345/212/240/346/250/241/345/235/227/346/265/213/350/257/225/346/214/207/345/215/227.md +147 -0
  114. package/docs//347/211/210/346/234/254/351/224/201/345/256/232/347/216/257/345/242/203/347/256/241/347/220/206/346/226/271/346/241/210.md +331 -0
  115. package/docs//347/216/257/345/242/203/345/217/230/351/207/217/344/270/216/350/277/220/350/241/214/346/227/266/347/233/256/345/275/225/350/256/276/350/256/241.md +499 -0
  116. package/docs//347/216/257/345/242/203/347/256/241/347/220/206/345/256/214/346/225/264/346/226/271/346/241/210.md +334 -0
  117. package/docs//350/231/232/346/213/237/346/250/241/345/235/227/344/270/255/350/275/254/346/234/215/345/212/241/345/256/214/346/225/264/350/256/276/350/256/241.md +1496 -0
  118. package/docs//350/231/232/346/213/237/347/216/257/345/242/203/345/267/245/344/275/234/345/216/237/347/220/206.md +163 -0
  119. package/docs//350/256/241/345/210/222/347/256/241/347/220/206/345/231/250/344/275/277/347/224/250/346/214/207/345/215/227.md +196 -0
  120. package/docs//350/256/244/350/257/201/346/250/241/345/235/227/344/270/216Gateway/350/256/276/350/256/241/346/226/271/346/241/210.md +765 -0
  121. package/docs//350/277/234/347/250/213/346/250/241/345/235/227/350/256/276/350/256/241-/346/227/247/347/211/210.md +1117 -0
  122. package/docs//350/277/234/347/250/213/346/250/241/345/235/227/350/256/276/350/256/241.md +451 -0
  123. package/docs//351/207/215/346/236/204/346/234/272/345/210/266/346/270/205/345/215/225.md +192 -0
  124. package/docs//351/223/276/350/267/257/350/277/275/350/270/252/346/226/271/346/241/210.md +242 -0
  125. package/docs//351/231/215/347/272/247/347/255/226/347/225/245/350/256/276/350/256/241/346/226/271/346/241/210.md +618 -0
  126. package/extensions/agents/assistant/entry.py +113 -14
  127. package/extensions/agents/assistant/module.md +27 -22
  128. package/extensions/agents/assistant/server.py +291 -105
  129. package/extensions/channels/acp_channel/entry.py +114 -16
  130. package/extensions/channels/acp_channel/module.md +4 -0
  131. package/extensions/channels/acp_channel/server.py +396 -105
  132. package/extensions/channels/phone_channel/__init__.py +1 -0
  133. package/extensions/channels/phone_channel/entry.py +503 -0
  134. package/extensions/channels/phone_channel/module.md +31 -0
  135. package/extensions/channels/phone_channel/server.py +686 -0
  136. package/extensions/event_hub_bench/entry.py +55 -12
  137. package/extensions/event_hub_bench/module.md +27 -27
  138. package/extensions/services/audit/README.md +134 -0
  139. package/extensions/services/audit/collector.py +73 -0
  140. package/extensions/services/audit/entry.py +444 -0
  141. package/extensions/services/audit/module.md +66 -0
  142. package/extensions/services/audit/query_audit.py +111 -0
  143. package/extensions/services/audit/routes/__init__.py +1 -0
  144. package/extensions/services/audit/routes/routes_audit.py +113 -0
  145. package/extensions/services/audit/schemas/__init__.py +5 -0
  146. package/extensions/services/audit/schemas/audit_event.py +92 -0
  147. package/extensions/services/audit/server.py +542 -0
  148. package/extensions/services/audit/storage.py +95 -0
  149. package/extensions/services/auth/entry.py +1054 -0
  150. package/extensions/services/auth/module.md +31 -0
  151. package/extensions/services/auth/token_store.py +185 -0
  152. package/extensions/services/auth/verifiers/evol_account.py +101 -0
  153. package/extensions/services/auth/verifiers/kite_token.py +38 -0
  154. package/extensions/services/auth/verifiers/pairing_code.py +71 -0
  155. package/extensions/services/backup/entry.py +494 -197
  156. package/extensions/services/backup/module.md +4 -2
  157. package/extensions/services/dataclaw/api/__init__.py +0 -0
  158. package/extensions/services/dataclaw/api/admin.py +367 -0
  159. package/extensions/services/dataclaw/api/copyright.py +175 -0
  160. package/extensions/services/dataclaw/api/credits.py +177 -0
  161. package/extensions/services/dataclaw/api/data.py +179 -0
  162. package/extensions/services/dataclaw/api/demands.py +269 -0
  163. package/extensions/services/dataclaw/api/feeds.py +262 -0
  164. package/extensions/services/dataclaw/api/identity.py +505 -0
  165. package/extensions/services/dataclaw/api/notifications.py +104 -0
  166. package/extensions/services/dataclaw/api/reviews.py +138 -0
  167. package/extensions/services/dataclaw/api/search.py +153 -0
  168. package/extensions/services/dataclaw/api/subscriptions.py +157 -0
  169. package/extensions/services/dataclaw/config.json5 +96 -0
  170. package/extensions/services/dataclaw/core/__init__.py +0 -0
  171. package/extensions/services/dataclaw/core/auth.py +95 -0
  172. package/extensions/services/dataclaw/core/config.py +50 -0
  173. package/extensions/services/dataclaw/core/database.py +70 -0
  174. package/extensions/services/dataclaw/entry.py +416 -0
  175. package/extensions/services/dataclaw/gofeed/351/241/271/347/233/256/346/211/200/346/234/211/346/235/203/350/275/254/347/247/273/346/265/201/347/250/213/350/257/264/346/230/216.md +309 -0
  176. package/extensions/services/dataclaw/migrate.py +283 -0
  177. package/extensions/services/dataclaw/models/__init__.py +0 -0
  178. package/extensions/services/dataclaw/module.md +49 -0
  179. package/extensions/services/dataclaw/requirements.txt +18 -0
  180. package/extensions/services/dataclaw/server.py +759 -0
  181. package/extensions/services/dataclaw/services/__init__.py +0 -0
  182. package/extensions/services/dataclaw/services/agent_service.py +132 -0
  183. package/extensions/services/dataclaw/services/credit_service.py +235 -0
  184. package/extensions/services/dataclaw/services/email_service.py +140 -0
  185. package/extensions/services/dataclaw/services/feed_service.py +259 -0
  186. package/extensions/services/dataclaw/services/notification_service.py +209 -0
  187. package/extensions/services/dataclaw/services/oauth_service.py +275 -0
  188. package/extensions/services/dataclaw/services/pricing.py +102 -0
  189. package/extensions/services/dataclaw/services/quality.py +79 -0
  190. package/extensions/services/dataclaw/services/reputation.py +142 -0
  191. package/extensions/services/dataclaw/services/sms_service.py +174 -0
  192. package/extensions/services/dataclaw/static/css/common.css +853 -0
  193. package/extensions/services/dataclaw/static/css/themes/blue.css +42 -0
  194. package/extensions/services/dataclaw/static/css/themes/dark.css +42 -0
  195. package/extensions/services/dataclaw/static/css/themes/light.css +35 -0
  196. package/extensions/services/dataclaw/static/js/api.js +103 -0
  197. package/extensions/services/dataclaw/static/js/common.js +321 -0
  198. package/extensions/services/dataclaw/static/js/i18n.js +95 -0
  199. package/extensions/services/dataclaw/static/js/pages/admin.js +152 -0
  200. package/extensions/services/dataclaw/static/js/pages/dashboard.js +82 -0
  201. package/extensions/services/dataclaw/static/js/pages/feed-detail.js +180 -0
  202. package/extensions/services/dataclaw/static/js/pages/feed-manage.js +158 -0
  203. package/extensions/services/dataclaw/static/js/theme.js +46 -0
  204. package/extensions/services/dataclaw/static/locales/en-US.json +464 -0
  205. package/extensions/services/dataclaw/static/locales/ja-JP.json +464 -0
  206. package/extensions/services/dataclaw/static/locales/zh-CN.json +464 -0
  207. package/extensions/services/dataclaw/templates/admin/index.html +90 -0
  208. package/extensions/services/dataclaw/templates/base.html +136 -0
  209. package/extensions/services/dataclaw/templates/credits/balance.html +106 -0
  210. package/extensions/services/dataclaw/templates/credits/deposit.html +164 -0
  211. package/extensions/services/dataclaw/templates/credits/history.html +90 -0
  212. package/extensions/services/dataclaw/templates/dashboard.html +52 -0
  213. package/extensions/services/dataclaw/templates/demands/create.html +78 -0
  214. package/extensions/services/dataclaw/templates/demands/detail.html +136 -0
  215. package/extensions/services/dataclaw/templates/demands/list.html +94 -0
  216. package/extensions/services/dataclaw/templates/feeds/create.html +95 -0
  217. package/extensions/services/dataclaw/templates/feeds/detail.html +110 -0
  218. package/extensions/services/dataclaw/templates/feeds/list.html +110 -0
  219. package/extensions/services/dataclaw/templates/feeds/manage.html +88 -0
  220. package/extensions/services/dataclaw/templates/index.html +185 -0
  221. package/extensions/services/dataclaw/templates/login.html +246 -0
  222. package/extensions/services/dataclaw/templates/register.html +164 -0
  223. package/extensions/services/dataclaw/templates/settings/notifications.html +96 -0
  224. package/extensions/services/dataclaw/templates/settings/profile.html +167 -0
  225. package/extensions/services/dataclaw/templates/subscriptions/list.html +64 -0
  226. package/extensions/services/dataclaw/tests/__init__.py +0 -0
  227. package/extensions/services/dataclaw/tests/conftest.py +68 -0
  228. package/extensions/services/dataclaw/tests/integration/__init__.py +0 -0
  229. package/extensions/services/dataclaw/tests/integration/test_workflows.py +239 -0
  230. package/extensions/services/dataclaw/tests/unit/__init__.py +0 -0
  231. package/extensions/services/dataclaw/tests/unit/test_admin.py +70 -0
  232. package/extensions/services/dataclaw/tests/unit/test_copyright.py +63 -0
  233. package/extensions/services/dataclaw/tests/unit/test_credits.py +80 -0
  234. package/extensions/services/dataclaw/tests/unit/test_data.py +98 -0
  235. package/extensions/services/dataclaw/tests/unit/test_demands.py +106 -0
  236. package/extensions/services/dataclaw/tests/unit/test_feeds.py +98 -0
  237. package/extensions/services/dataclaw/tests/unit/test_identity.py +88 -0
  238. package/extensions/services/dataclaw/tests/unit/test_notifications.py +36 -0
  239. package/extensions/services/dataclaw/tests/unit/test_reviews.py +68 -0
  240. package/extensions/services/dataclaw/tests/unit/test_search.py +64 -0
  241. package/extensions/services/dataclaw/tests/unit/test_subscriptions.py +65 -0
  242. package/extensions/services/dataclaw/tests/unit/test_system.py +106 -0
  243. package/extensions/services/dataclaw/utils/__init__.py +0 -0
  244. package/extensions/services/dataclaw/utils/crypto.py +38 -0
  245. package/extensions/services/dataclaw/utils/id_generator.py +52 -0
  246. package/extensions/services/dataclaw/ws/__init__.py +0 -0
  247. package/extensions/services/dataclaw/ws/handler.py +163 -0
  248. package/extensions/services/dataclaw//345/215/217/350/256/2561-/351/241/271/347/233/256/346/235/241/344/273/266/346/216/210/346/235/203/344/270/216/350/202/241/346/235/203/345/257/271/344/273/267/345/215/217/350/256/256.md +243 -0
  249. package/extensions/services/dataclaw//345/215/217/350/256/2562-/351/241/271/347/233/256/350/264/255/344/271/260/346/235/203/344/270/216/345/244/226/345/214/205/345/247/224/346/211/230/345/274/200/345/217/221/345/215/217/350/256/256.md +434 -0
  250. package/extensions/services/evol/__init__.py +1 -0
  251. package/extensions/services/evol/async_http.py +551 -0
  252. package/extensions/services/evol/auth_manager.py +602 -443
  253. package/extensions/services/evol/config.json5 +16 -0
  254. package/extensions/services/evol/entry.py +568 -406
  255. package/extensions/services/evol/evol_api.py +969 -173
  256. package/extensions/services/evol/mfa_totp.py +77 -0
  257. package/extensions/services/evol/module.md +150 -32
  258. package/extensions/services/evol/nonce_pool.py +113 -0
  259. package/extensions/services/evol/oauth_manager.py +223 -0
  260. package/extensions/services/evol/pairing.py +3 -2
  261. package/extensions/services/evol/pairing_codes.jsonl +1 -0
  262. package/extensions/services/evol/relay.py +1031 -682
  263. package/extensions/services/evol/relay_config.json5 +85 -67
  264. package/extensions/services/evol/routes/routes_llm.py +231 -0
  265. package/extensions/services/evol/routes/routes_rpc.py +90 -89
  266. package/extensions/services/evol/routes/routes_test.py +11 -4
  267. package/extensions/services/evol/server.py +2426 -875
  268. package/extensions/services/evol/static/assets/CommissionView-Cs_ys6Gm.js +1 -0
  269. package/extensions/services/evol/static/assets/CommissionView-DACet_Oo.css +1 -0
  270. package/extensions/services/evol/static/assets/IframePage-DbO11U9G.js +1 -0
  271. package/extensions/services/evol/static/assets/IframePage-c572lT8i.css +1 -0
  272. package/extensions/services/evol/static/assets/TeamDetailView-DULrGD7k.css +1 -0
  273. package/extensions/services/evol/static/assets/TeamDetailView-gy_MBEqG.js +139 -0
  274. package/extensions/services/evol/static/assets/element-plus-Bd7pZkkM.js +63 -0
  275. package/extensions/services/evol/static/assets/index-CmMONKzG.css +1 -0
  276. package/extensions/services/evol/static/assets/index-D44bBe__.js +2 -0
  277. package/extensions/services/evol/static/assets/vue-vendor-DtF-__I4.js +29 -0
  278. package/extensions/services/evol/static/index.html +16 -781
  279. package/extensions/services/evol/static/logo.png +0 -0
  280. package/extensions/services/evol/stats_manager.py +243 -240
  281. package/extensions/services/evol/web/README.md +89 -0
  282. package/extensions/services/evol/web/build.bat +44 -0
  283. package/extensions/services/evol/web/index.html +13 -0
  284. package/extensions/services/evol/web/package-lock.json +1718 -0
  285. package/extensions/services/evol/web/package.json +26 -0
  286. package/extensions/services/evol/web/public/logo.png +0 -0
  287. package/extensions/services/evol/web/src/App.vue +7 -0
  288. package/extensions/services/evol/web/src/components/layout/AppHeader.vue +202 -0
  289. package/extensions/services/evol/web/src/components/layout/AppLayout.vue +61 -0
  290. package/extensions/services/evol/web/src/components/layout/AppSidebar.vue +115 -0
  291. package/extensions/services/evol/web/src/components/login/LoginPage.vue +271 -0
  292. package/extensions/services/evol/web/src/components/team/AddMemberModal.vue +181 -0
  293. package/extensions/services/evol/web/src/components/team/GroupTreeNode.vue +156 -0
  294. package/extensions/services/evol/web/src/components/team/TeamAlertConfig.vue +221 -0
  295. package/extensions/services/evol/web/src/components/team/TeamBillModal.vue +165 -0
  296. package/extensions/services/evol/web/src/components/team/TeamMembersAndGroups.vue +499 -0
  297. package/extensions/services/evol/web/src/components/team/TeamStatsPanel.vue +907 -0
  298. package/extensions/services/evol/web/src/components/team/TreeNode.vue +331 -0
  299. package/extensions/services/evol/web/src/components/team/stats/StatsExportProgress.vue +44 -0
  300. package/extensions/services/evol/web/src/components/team/stats/StatsHeader.vue +89 -0
  301. package/extensions/services/evol/web/src/components/team/stats/StatsMemberDetail.vue +415 -0
  302. package/extensions/services/evol/web/src/components/team/stats/StatsSummary.vue +42 -0
  303. package/extensions/services/evol/web/src/components/team/stats/helpers.ts +195 -0
  304. package/extensions/services/evol/web/src/components/team/stats/stats.css +741 -0
  305. package/extensions/services/evol/web/src/components/team/stats/useStatsApi.ts +114 -0
  306. package/extensions/services/evol/web/src/components/team/stats/useStatsCharts.ts +242 -0
  307. package/extensions/services/evol/web/src/components/team/stats/useStatsExport.ts +232 -0
  308. package/extensions/services/evol/web/src/composables/useFormatters.ts +42 -0
  309. package/extensions/services/evol/web/src/composables/useTheme.ts +52 -0
  310. package/extensions/services/evol/web/src/env.d.ts +7 -0
  311. package/extensions/services/evol/web/src/i18n/en.ts +361 -0
  312. package/extensions/services/evol/web/src/i18n/index.ts +36 -0
  313. package/extensions/services/evol/web/src/i18n/zh.ts +379 -0
  314. package/extensions/services/evol/web/src/main.ts +21 -0
  315. package/extensions/services/evol/web/src/router/index.ts +81 -0
  316. package/extensions/services/evol/web/src/services/kernel-client.ts +406 -0
  317. package/extensions/services/evol/web/src/stores/auth.ts +189 -0
  318. package/extensions/services/evol/web/src/stores/connection.ts +134 -0
  319. package/extensions/services/evol/web/src/stores/pages.ts +79 -0
  320. package/extensions/services/evol/web/src/styles/base.css +213 -0
  321. package/extensions/services/evol/web/src/styles/variables.css +138 -0
  322. package/extensions/services/evol/web/src/types/rpc.ts +35 -0
  323. package/extensions/services/evol/web/src/types/token.ts +87 -0
  324. package/extensions/services/evol/web/src/views/AccountView.vue +1532 -0
  325. package/extensions/services/evol/web/src/views/AiServiceView.vue +219 -0
  326. package/extensions/services/evol/web/src/views/CommissionView.vue +1220 -0
  327. package/extensions/services/evol/web/src/views/CreditsView.vue +131 -0
  328. package/extensions/services/evol/web/src/views/EndpointView.vue +163 -0
  329. package/extensions/services/evol/web/src/views/IframePage.vue +120 -0
  330. package/extensions/services/evol/web/src/views/TeamDetailView.vue +473 -0
  331. package/extensions/services/evol/web/src/views/TeamView.vue +332 -0
  332. package/extensions/services/evol/web/tsconfig.json +31 -0
  333. package/extensions/services/evol/web/tsconfig.node.json +10 -0
  334. package/extensions/services/evol/web/vite.config.ts +49 -0
  335. package/extensions/services/evolmem/__init__.py +0 -0
  336. package/extensions/services/evolmem/entry.py +387 -0
  337. package/extensions/services/evolmem/hooks/__init__.py +0 -0
  338. package/extensions/services/evolmem/hooks/assistant_stop.py +228 -0
  339. package/extensions/services/evolmem/hooks/common.py +76 -0
  340. package/extensions/services/evolmem/hooks/pre_tool_use.py +56 -0
  341. package/extensions/services/evolmem/hooks/session_end.py +133 -0
  342. package/extensions/services/evolmem/hooks/session_start.py +229 -0
  343. package/extensions/services/evolmem/hooks/user_prompt.py +122 -0
  344. package/extensions/services/evolmem/module.md +48 -0
  345. package/extensions/services/evolmem/prompts/00-server-info.md +28 -0
  346. package/extensions/services/evolmem/prompts/01-behavior.md +46 -0
  347. package/extensions/services/evolmem/prompts/02-summary-format.md +112 -0
  348. package/extensions/services/evolmem/prompts/03-file-query.md +92 -0
  349. package/extensions/services/evolmem/prompts/04-topic-stats.md +11 -0
  350. package/extensions/services/evolmem/prompts/05-recent-topics.md +84 -0
  351. package/extensions/services/evolmem/scripts/__init__.py +0 -0
  352. package/extensions/services/evolmem/scripts/extract_keywords.py +40 -0
  353. package/extensions/services/evolmem/scripts/search_topics.py +91 -0
  354. package/extensions/services/evolmem/server.py +641 -0
  355. package/extensions/services/gateway/entry.py +964 -0
  356. package/extensions/services/gateway/module.md +29 -0
  357. package/extensions/services/gateway/nonce_pool.py +65 -0
  358. package/extensions/services/gateway/relay.py +133 -0
  359. package/extensions/services/gateway/ws_server.py +285 -0
  360. package/extensions/services/kite_console/auth_manager.py +603 -0
  361. package/extensions/services/kite_console/config.json5 +19 -0
  362. package/extensions/services/kite_console/config_loader.py +117 -0
  363. package/extensions/services/kite_console/entry.py +528 -0
  364. package/extensions/services/kite_console/evol_api.py +179 -0
  365. package/extensions/services/kite_console/evol_config.json5 +29 -0
  366. package/extensions/services/kite_console/mfa_totp.py +77 -0
  367. package/extensions/services/kite_console/migrate_tokens.py +122 -0
  368. package/extensions/services/kite_console/module.md +37 -0
  369. package/extensions/services/kite_console/nonce_pool.py +113 -0
  370. package/extensions/services/kite_console/oauth_manager.py +223 -0
  371. package/extensions/services/kite_console/pairing.py +280 -0
  372. package/extensions/services/kite_console/pairing_codes.jsonl +2 -0
  373. package/extensions/services/kite_console/relay.py +1350 -0
  374. package/extensions/services/kite_console/relay_config.json5 +96 -0
  375. package/extensions/services/kite_console/routes/__init__.py +1 -0
  376. package/extensions/services/kite_console/routes/routes_llm.py +231 -0
  377. package/extensions/services/kite_console/routes/routes_proxy.py +115 -0
  378. package/extensions/services/kite_console/routes/routes_rpc.py +89 -0
  379. package/extensions/services/kite_console/routes/routes_test.py +68 -0
  380. package/extensions/services/kite_console/server.py +1742 -0
  381. package/extensions/services/{evol → kite_console}/static/css/style.css +656 -2
  382. package/extensions/services/kite_console/static/index.html +1524 -0
  383. package/extensions/services/{evol → kite_console}/static/js/dialog.js +11 -4
  384. package/extensions/services/kite_console/static/js/evol-app.js +7740 -0
  385. package/extensions/services/{evol/static/js/evol-app.js → kite_console/static/js/evol-app.js.backup} +2777 -1949
  386. package/extensions/services/kite_console/static/js/kernel-client.js +560 -0
  387. package/extensions/services/{evol/static/js/kernel-client.js → kite_console/static/js/kernel-client.js.backup} +41 -3
  388. package/extensions/services/{evol → kite_console}/static/js/registry-tests.js +7 -0
  389. package/extensions/services/kite_console/static/js/tests/ARCHITECTURE.md +67 -0
  390. package/extensions/services/kite_console/static/js/tests/README.md +140 -0
  391. package/extensions/services/kite_console/static/js/tests/index.js +161 -0
  392. package/extensions/services/kite_console/static/js/tests/integration/auth.js +120 -0
  393. package/extensions/services/kite_console/static/js/tests/integration/channel-interaction.js +188 -0
  394. package/extensions/services/kite_console/static/js/tests/integration/elastic-connection.js +115 -0
  395. package/extensions/services/kite_console/static/js/tests/integration/full-workflow.js +43 -0
  396. package/extensions/services/kite_console/static/js/tests/integration/multi-instance.js +304 -0
  397. package/extensions/services/kite_console/static/js/tests/integration/nested-rpc.js +266 -0
  398. package/extensions/services/kite_console/static/js/tests/integration/pingpong.js +25 -0
  399. package/extensions/services/kite_console/static/js/tests/integration/redis.js +227 -0
  400. package/extensions/services/kite_console/static/js/tests/integration/registry-core.js +52 -0
  401. package/extensions/services/kite_console/static/js/tests/integration/remote-deploy.js +85 -0
  402. package/extensions/services/kite_console/static/js/tests/integration/require-init.js +96 -0
  403. package/extensions/services/kite_console/static/js/tests/integration/scaling-control.js +193 -0
  404. package/extensions/services/kite_console/static/js/tests/integration/trace.js +109 -0
  405. package/extensions/services/kite_console/static/js/tests/modules/acp_channel.js +339 -0
  406. package/extensions/services/kite_console/static/js/tests/modules/auth.js +96 -0
  407. package/extensions/services/kite_console/static/js/tests/modules/backup.js +49 -0
  408. package/extensions/services/kite_console/static/js/tests/modules/gateway.js +41 -0
  409. package/extensions/services/kite_console/static/js/tests/modules/kernel.js +90 -0
  410. package/extensions/services/kite_console/static/js/tests/modules/launcher.js +75 -0
  411. package/extensions/services/kite_console/static/js/tests/modules/multi_instance.js +129 -0
  412. package/extensions/services/kite_console/static/js/tests/modules/phone_channel.js +364 -0
  413. package/extensions/services/kite_console/static/js/tests/modules/redis.js +178 -0
  414. package/extensions/services/kite_console/static/js/tests/modules/watchdog.js +60 -0
  415. package/extensions/services/kite_console/static/js/tests/modules/web.js +70 -0
  416. package/extensions/services/kite_console/static/js/tests/test-runner.js +123 -0
  417. package/extensions/services/kite_console/static/js/virtual-list.js +200 -0
  418. package/extensions/services/kite_console/static/test_kernel_client_token.html +352 -0
  419. package/extensions/services/kite_console/stats_manager.py +247 -0
  420. package/extensions/services/logs/README.md +215 -0
  421. package/extensions/services/logs/api_logger.py +37 -0
  422. package/extensions/services/logs/baseline.py +121 -0
  423. package/extensions/services/logs/cleaner.py +76 -0
  424. package/extensions/services/logs/entry.py +449 -0
  425. package/extensions/services/logs/formatter.py +129 -0
  426. package/extensions/services/logs/module.md +38 -0
  427. package/extensions/services/logs/quick_diagnostic.py +128 -0
  428. package/extensions/services/logs/routes/__init__.py +1 -0
  429. package/extensions/services/logs/routes/routes_logs.py +218 -0
  430. package/extensions/services/logs/routes/routes_logs.py.backup +173 -0
  431. package/extensions/services/logs/scanner.py +100 -0
  432. package/extensions/services/logs/searcher.py +263 -0
  433. package/extensions/services/logs/server.py +553 -0
  434. package/extensions/services/logs.zip +0 -0
  435. package/extensions/services/model_service/config.json5 +30 -0
  436. package/extensions/services/model_service/entry.py +620 -171
  437. package/extensions/services/model_service/module.md +11 -2
  438. package/extensions/services/proxy/__init__.py +0 -0
  439. package/extensions/services/proxy/aid_manager.py +419 -0
  440. package/extensions/services/proxy/auth_bridge.py +182 -0
  441. package/extensions/services/proxy/config_store.py +79 -0
  442. package/extensions/services/proxy/entry.py +528 -0
  443. package/extensions/services/proxy/evol/presenter/agentIdPresenter.py +2 -2
  444. package/extensions/services/proxy/evol/presenter/apikeyPresenter.py +18 -28
  445. package/extensions/services/proxy/evol/presenter/configPresenter.py +80 -1127
  446. package/extensions/services/proxy/evol/presenter/userPresenter.py +71 -477
  447. package/extensions/services/proxy/evol/server/claude_proxy_async.py +11 -7
  448. package/extensions/services/proxy/module.md +151 -0
  449. package/extensions/services/proxy/server.py +952 -271
  450. package/extensions/services/redis/ALIGNMENT_CHECKLIST.md +121 -0
  451. package/extensions/services/redis/ALIGNMENT_STATUS.md +548 -0
  452. package/extensions/services/redis/config.json5 +8 -0
  453. package/extensions/services/redis/entry.py +1509 -0
  454. package/extensions/services/redis/entry.py.backup +405 -0
  455. package/extensions/services/redis/module.md +48 -0
  456. package/extensions/services/redis/redis_builtin.py +332 -0
  457. package/extensions/services/redis/redis_external.py +164 -0
  458. package/extensions/services/testUi/entry.py +446 -0
  459. package/extensions/services/testUi/module.md +18 -0
  460. package/extensions/services/testUi/ui/cards.html +131 -0
  461. package/extensions/services/testUi/ui/index.html +22 -0
  462. package/extensions/services/testUi/ui/particles.html +143 -0
  463. package/extensions/services/watchdog/entry.py +1258 -793
  464. package/extensions/services/watchdog/module.md +2 -0
  465. package/extensions/services/watchdog/monitor.py +465 -87
  466. package/extensions/services/web/auth_manager.py +602 -0
  467. package/extensions/services/web/config.json5 +11 -0
  468. package/extensions/services/web/entry.py +598 -478
  469. package/extensions/services/web/mfa_totp.py +77 -0
  470. package/extensions/services/web/module.md +16 -13
  471. package/extensions/services/web/nonce_pool.py +113 -0
  472. package/extensions/services/web/oauth_manager.py +223 -0
  473. package/extensions/services/web/pairing.py +3 -2
  474. package/extensions/services/web/pairing_codes.jsonl +1 -0
  475. package/extensions/services/web/relay.py +442 -63
  476. package/extensions/services/web/relay_config.json5 +1 -2
  477. package/extensions/services/web/routes/routes_rpc.py +6 -6
  478. package/extensions/services/web/server.py +360 -173
  479. package/extensions/services/web/static/index.html +1752 -1738
  480. package/extensions/services/web/static/js/app.js +32 -0
  481. package/extensions/services/web/static/js/kernel-client.js +48 -9
  482. package/extensions/services/web/vendor/bluetooth/audio.py +1 -1
  483. package/extensions/services/web/vendor/config.py +2 -2
  484. package/extensions/services/web/vendor/storage/identity.py +1 -1
  485. package/kernel/entry.py +77 -23
  486. package/kernel/event_hub.py +1122 -74
  487. package/kernel/module.md +2 -1
  488. package/kernel/registry_store.py +208 -11
  489. package/kernel/rpc_router.py +1400 -491
  490. package/kernel/server.py +1021 -134
  491. package/kite_cli/__init__.py +9 -1
  492. package/kite_cli/builders/__init__.py +4 -0
  493. package/kite_cli/builders/base.py +67 -0
  494. package/kite_cli/builders/custom.py +31 -0
  495. package/kite_cli/builders/detector.py +56 -0
  496. package/kite_cli/builders/go.py +34 -0
  497. package/kite_cli/builders/gradle.py +41 -0
  498. package/kite_cli/builders/maven.py +36 -0
  499. package/kite_cli/builders/npm.py +44 -0
  500. package/kite_cli/builders/python.py +37 -0
  501. package/kite_cli/commands/BUILD_GUIDE.md +109 -0
  502. package/kite_cli/commands/build.py +142 -0
  503. package/kite_cli/commands/check.py +60 -0
  504. package/kite_cli/commands/config.py +156 -0
  505. package/kite_cli/commands/deps.py +58 -0
  506. package/kite_cli/commands/deps_install.py +7 -7
  507. package/kite_cli/commands/disable.py +162 -0
  508. package/kite_cli/commands/enable.py +162 -0
  509. package/kite_cli/commands/export.py +96 -0
  510. package/kite_cli/commands/import_cmd.py +110 -0
  511. package/kite_cli/commands/install.py +50 -23
  512. package/kite_cli/commands/install_skill.py +107 -0
  513. package/kite_cli/commands/list.py +128 -31
  514. package/kite_cli/commands/outdated.py +202 -0
  515. package/kite_cli/commands/search.py +33 -17
  516. package/kite_cli/commands/update.py +115 -2
  517. package/kite_cli/commands/venv_setup.py +6 -6
  518. package/kite_cli/commands/why.py +48 -0
  519. package/kite_cli/core/config_manager.py +145 -0
  520. package/kite_cli/core/downloader.py +32 -2
  521. package/kite_cli/main.py +153 -7
  522. package/kite_cli/utils/colors.py +153 -0
  523. package/kite_cli/utils/dependency_graph.py +209 -0
  524. package/kite_cli/utils/process.py +55 -0
  525. package/kite_cli/utils/progress.py +207 -0
  526. package/kite_cli/utils/table.py +101 -0
  527. package/launcher/count_lines.py +192 -43
  528. package/launcher/entry.py +4543 -2802
  529. package/launcher/logging_setup.py +54 -1
  530. package/launcher/module.md +32 -6
  531. package/launcher/module_scanner.py +93 -20
  532. package/launcher/process_manager.py +355 -76
  533. package/main.py +6 -0
  534. package/package.json +4 -1
  535. package/requirements.txt +41 -38
  536. package/scripts/auto-fix-deps.py +128 -0
  537. package/scripts/env-manager.js +25 -2
  538. package/scripts/final-test.js +78 -0
  539. package/scripts/setup-python-env.js +700 -191
  540. package/scripts/test-alluser.js +48 -0
  541. package/scripts/test-different-version.js +86 -0
  542. package/scripts/test-direct.js +63 -0
  543. package/scripts/test-extract-installer.js +28 -0
  544. package/scripts/test-install-log.js +54 -0
  545. package/scripts/test-installer.js +39 -0
  546. package/scripts/test-integration.js +250 -0
  547. package/scripts/test-real-install.js +210 -0
  548. package/scripts/test-targetdir.js +49 -0
  549. package/scripts/test-venv-real.js +47 -0
  550. package/scripts/test-venv-simple.js +57 -0
  551. package/scripts/test-wait.js +49 -0
  552. package/scripts/test-with-log.js +63 -0
  553. package/extensions/services/evol/config.yaml +0 -149
  554. package/extensions/services/evol/routes/routes_management_ws.py +0 -127
  555. package/extensions/services/evol/static/index_evol.html +0 -14
  556. package/extensions/services/evol/static/js/app.js +0 -6304
  557. package/extensions/services/evol/static/js/auth.js +0 -326
  558. package/extensions/services/evol/static/js/evol-app-fixed.js +0 -50
  559. package/extensions/services/evol/static/js/evol-app.js.bak +0 -1800
  560. package/extensions/services/evol/static/js/kernel-client-example.js +0 -228
  561. package/extensions/services/evol/static/js/main.js +0 -141
  562. package/extensions/services/evol/static/js/stats.js +0 -217
  563. package/extensions/services/evol/static/js/token-manager.js +0 -175
  564. package/extensions/services/proxy/CHANGELOG_20260308.md +0 -258
  565. package/extensions/services/proxy/_fix_prints.py +0 -133
  566. package/extensions/services/proxy/_fix_prints2.py +0 -87
  567. package/extensions/services/proxy/console_auth.py +0 -109
  568. package/extensions/services/proxy/logs/websocket.log +0 -260
  569. package/extensions/services/proxy/main.py +0 -240
  570. package/extensions/services/proxy/requirements.txt +0 -13
  571. package/extensions/services/web/config.yaml +0 -149
  572. /package/extensions/services/{evol → kite_console}/static/pairing.html +0 -0
  573. /package/extensions/services/{evol → kite_console}/static/test_registry.html +0 -0
  574. /package/extensions/services/{evol → kite_console}/static/test_relay.html +0 -0
@@ -19,21 +19,36 @@ SYSTEM_BROADCAST_EVENTS = {
19
19
  "module.crashed", "module.exiting", "module.offline",
20
20
  "module.shutdown.ack", "module.shutdown.ready",
21
21
  "system.ready", "registry.updated",
22
+ "system.instance.started", "system.instance.stopped",
22
23
  }
23
24
 
24
25
 
25
26
  class AssistantServer:
26
27
 
27
- def __init__(self, token: str = "", kernel_port: int = 0, boot_t0: float = 0):
28
+ def __init__(self, token: str = "", kernel_port: int = 0, boot_t0: float = 0, max_connections: int = 1,
29
+ max_instances: int = 1, instance_elastic: bool = False,
30
+ gateway_url: str = "", kite_token: str = ""):
28
31
  self.token = token
29
32
  self.kernel_port = kernel_port
30
33
  self.boot_t0 = boot_t0
34
+ self.max_connections = max_connections
35
+ self.max_instances = max_instances
36
+ self.instance_elastic = instance_elastic
37
+ self.gateway_url = gateway_url
38
+ self.kite_token = kite_token
31
39
  self._ws_task: asyncio.Task | None = None
32
40
  self._test_task: asyncio.Task | None = None
33
41
  self._ws: object | None = None
34
42
  self._shutting_down = False
35
43
  self._exit_code = 0 # Exit code for main() to use
44
+ self._auth_failed = False
36
45
  self._start_time = time.time()
46
+ self._extra_ws: dict = {} # slot → WebSocket
47
+ self._extra_ws_tasks: dict = {} # slot → recv loop Task
48
+ self._has_registered = False
49
+ self._pending_rpc: dict[str, asyncio.Future] = {}
50
+ self._active_handlers = 0 # 当前正在处理的入站请求数
51
+ self._handler_capacity = 50 # 并发处理能力上限(用于压力计算)
37
52
 
38
53
  async def run(self):
39
54
  """Main entry point: start WebSocket loop and test event loop."""
@@ -71,6 +86,7 @@ class AssistantServer:
71
86
  if code in (4001, 4003):
72
87
  print(f"[assistant] Kernel 认证失败 (code {code}),退出")
73
88
  self._exit_code = 1
89
+ self._auth_failed = True
74
90
  self._shutting_down = True
75
91
  return
76
92
  if attempt >= max_retries:
@@ -87,20 +103,98 @@ class AssistantServer:
87
103
 
88
104
  async def _ws_connect(self):
89
105
  """Single WebSocket session: connect, subscribe, register, ready, receive loop."""
90
- url = f"ws://127.0.0.1:{self.kernel_port}/ws?token={self.token}&id=assistant"
106
+ url = f"ws://127.0.0.1:{self.kernel_port}/ws?id=assistant"
91
107
  print(f"[assistant] Connecting to Kernel (port {self.kernel_port})")
92
108
  async with websockets.connect(url, open_timeout=3, ping_interval=None, close_timeout=10) as ws:
109
+ # Send auth message first
110
+ auth_req = {
111
+ "jsonrpc": "2.0",
112
+ "id": "auth",
113
+ "method": "auth",
114
+ "params": {"token": self.token}
115
+ }
116
+ await ws.send(json.dumps(auth_req))
117
+
118
+ # Wait for auth response
119
+ auth_resp_raw = await asyncio.wait_for(ws.recv(), timeout=5)
120
+ auth_resp = json.loads(auth_resp_raw)
121
+ if "error" in auth_resp:
122
+ raise Exception(f"Auth failed: {auth_resp['error']}")
123
+
93
124
  self._ws = ws
94
125
  elapsed = time.monotonic() - self.boot_t0 if self.boot_t0 else 0
95
126
  elapsed_str = f" ({elapsed:.1f}s)" if elapsed else ""
96
127
  print(f"[assistant] Connected to Kernel{elapsed_str}")
97
128
 
98
- # Step 1: Subscribe to events (先订阅)
129
+ # Start receiver task before subscribe/register so responses can be routed
130
+ receiver_task = asyncio.create_task(self._ws_receiver(ws))
131
+
132
+ try:
133
+ # subscribe/register/module.ready 由 _do_init 在收到 system.require_init 后执行
134
+
135
+ # Wait for receiver to finish (connection closed or error)
136
+ await receiver_task
137
+ finally:
138
+ receiver_task.cancel()
139
+ for fut in self._pending_rpc.values():
140
+ if not fut.done():
141
+ fut.set_result({"error": {"code": -32001, "message": "Connection lost"}})
142
+ self._pending_rpc.clear()
143
+
144
+ async def _ws_receiver(self, ws):
145
+ """Receive loop for main WebSocket connection.
146
+
147
+ CRITICAL: RPC 死锁防范
148
+ - 入站 RPC 请求必须用 create_task() 异步执行,不可 await
149
+ - 原因:如果 handler 内部调用 rpc_call() 发出站请求,出站响应需要本接收循环来分发
150
+ - 如果接收循环被 await handler 阻塞,出站响应永远收不到 → 超时死锁
151
+ - 事件通知和 RPC 响应可以同步处理(它们不会反向调用 rpc_call)
152
+ """
153
+ try:
154
+ async for raw in ws:
155
+ try:
156
+ msg = json.loads(raw)
157
+ except (json.JSONDecodeError, TypeError):
158
+ continue
159
+
160
+ try:
161
+ has_method = "method" in msg
162
+ has_id = "id" in msg
163
+
164
+ # 检测 system.require_init 事件,触发注册流程
165
+ if has_method and not has_id:
166
+ params = msg.get("params", {})
167
+ event = params.get("event", "")
168
+ if event == "system.require_init":
169
+ asyncio.create_task(self._do_init(ws))
170
+ continue
171
+
172
+ if has_method and not has_id:
173
+ # JSON-RPC Notification (event delivery)
174
+ # Run in background to prevent deadlock if handler calls RPC
175
+ asyncio.create_task(self._handle_event_notification(msg))
176
+
177
+ elif not has_method and has_id:
178
+ # JSON-RPC Response (to our RPC calls)
179
+ self._handle_rpc_response(msg)
180
+ except Exception as e:
181
+ print(f"[assistant] 事件处理异常: {e}")
182
+ except websockets.exceptions.ConnectionClosed:
183
+ pass # Kernel 连接关闭,正常退出接收循环
184
+
185
+ async def _do_init(self, ws):
186
+ """收到 system.require_init 后执行:订阅 + 注册 + module.ready"""
187
+ try:
188
+ reason = "startup" if not self._has_registered else "recovery"
189
+
190
+ # Step 1: Subscribe to events
99
191
  await self._rpc_call(ws, "event.subscribe", {
100
- "events": ["module.started", "module.stopped", "module.shutdown"],
192
+ "events": [
193
+ "module.started", "module.stopped", "module.shutdown",
194
+ ],
101
195
  })
102
196
 
103
- # Step 2: Register to Kernel (再注册)
197
+ # Step 2: Register to Kernel
104
198
  await self._rpc_call(ws, "registry.register", {
105
199
  "module_id": "assistant",
106
200
  "module_type": "agent",
@@ -117,28 +211,88 @@ class AssistantServer:
117
211
  ],
118
212
  })
119
213
 
120
- # Step 3: Publish module.ready (every reconnect)
214
+ # Step 3: Publish module.ready
121
215
  if not self._shutting_down:
122
216
  startup_time = time.monotonic() - self.boot_t0 if self.boot_t0 else 0
123
- await self._rpc_call(ws, "event.publish", {
124
- "event_id": str(uuid.uuid4()),
125
- "event": "module.ready",
126
- "data": {
127
- "module_id": "assistant",
128
- "graceful_shutdown": True,
129
- "startup_time": startup_time,
130
- },
217
+ await self._publish_event(ws, "module.ready", {
218
+ "module_id": "assistant",
219
+ "graceful_shutdown": True,
220
+ "startup_time": startup_time,
221
+ "reason": reason,
131
222
  })
132
223
  elapsed_str = self._fmt_elapsed(self.boot_t0)
133
- print(f"[assistant] module.ready published ({elapsed_str})")
224
+ print(f"[assistant] module.ready published (reason={reason}, {elapsed_str})")
225
+ self._has_registered = True
226
+ except Exception as e:
227
+ print(f"[assistant] _do_init failed: {e}")
228
+ self._has_registered = False
229
+
230
+ async def _handle_event_notification(self, msg: dict):
231
+ """Handle an event notification (JSON-RPC 2.0 Notification with method='event')."""
232
+ params = msg.get("params", {})
233
+ event_type = params.get("event", "")
234
+ data = params.get("data", {})
235
+
236
+ # Handle system.ping event
237
+ if event_type == "system.ping":
238
+ await self._handle_ping_event(data)
239
+ return
134
240
 
135
- # Receive loop
136
- # CRITICAL: RPC 死锁防范
137
- # - 入站 RPC 请求必须用 create_task() 异步执行,不可 await
138
- # - 原因:如果 handler 内部调用 rpc_call() 发出站请求,出站响应需要本接收循环来分发
139
- # - 如果接收循环被 await handler 阻塞,出站响应永远收不到 → 超时死锁
140
- # - 事件通知和 RPC 响应可以同步处理(它们不会反向调用 rpc_call)
241
+ # 弹性连接 offer/release
242
+ if event_type == "system.connection.offer":
243
+ asyncio.create_task(self._handle_connection_offer(data))
244
+ return
245
+ if event_type == "system.connection.release":
246
+ asyncio.create_task(self._handle_connection_release(data))
247
+ return
141
248
 
249
+ # Layer 1: 处理订阅的事件
250
+ if event_type == "module.shutdown":
251
+ target = data.get("module_id", "")
252
+ reason = data.get("reason", "")
253
+ # Handle both targeted shutdown (module_id == "assistant") and broadcast shutdown (no module_id or launcher_lost)
254
+ if target.startswith("assistant") or not target or reason == "launcher_lost":
255
+ await self._handle_shutdown(self._ws)
256
+ return
257
+
258
+ # Layer 2: 忽略系统广播事件
259
+ if event_type in SYSTEM_BROADCAST_EVENTS:
260
+ return
261
+
262
+ # Layer 3: 警告未知事件(仅开发环境)
263
+ if os.environ.get("KITE_ENV") == "development":
264
+ print(f"[assistant] Debug: Unhandled event: {event_type}")
265
+
266
+ async def _handle_connection_offer(self, data):
267
+ """处理 Kernel 下发的 slot token,建立附加连接。"""
268
+ slots = data.get("slots", {})
269
+ for slot_str, info in slots.items():
270
+ slot = int(slot_str)
271
+ token = info.get("token", "")
272
+ if not token or slot in self._extra_ws:
273
+ continue
274
+ asyncio.create_task(self._connect_slot(slot, token))
275
+
276
+ async def _connect_slot(self, slot, token):
277
+ """建立单个 slot 附加连接。"""
278
+ ws_url = f"ws://127.0.0.1:{self.kernel_port}/ws"
279
+ try:
280
+ ws = await websockets.connect(ws_url, open_timeout=5, ping_interval=None, close_timeout=5)
281
+ auth_req = {"jsonrpc": "2.0", "id": f"auth-slot-{slot}", "method": "auth", "params": {"token": token}}
282
+ await ws.send(json.dumps(auth_req))
283
+ resp = json.loads(await asyncio.wait_for(ws.recv(), timeout=5))
284
+ if "error" in resp:
285
+ await ws.close()
286
+ return
287
+ self._extra_ws[slot] = ws
288
+ self._extra_ws_tasks[slot] = asyncio.create_task(self._slot_recv_loop(slot, ws))
289
+ print(f"[assistant] Slot {slot} connected")
290
+ except Exception as e:
291
+ print(f"[assistant] Slot {slot} connect failed: {e}")
292
+
293
+ async def _slot_recv_loop(self, slot, ws):
294
+ """附加 slot 接收循环:与主连接平等处理所有消息。"""
295
+ try:
142
296
  async for raw in ws:
143
297
  try:
144
298
  msg = json.loads(raw)
@@ -150,95 +304,125 @@ class AssistantServer:
150
304
  has_id = "id" in msg
151
305
 
152
306
  if has_method and not has_id:
153
- # JSON-RPC Notification (event delivery)
154
- params = msg.get("params", {})
155
- event_type = params.get("event", "")
156
- data = params.get("data", {})
157
-
158
- # Handle system.ping event
159
- if event_type == "system.ping":
160
- await self._handle_ping_event(data)
161
- continue
162
-
163
- # Layer 1: 处理订阅的事件
164
- if event_type == "module.shutdown":
165
- target = data.get("module_id", "")
166
- reason = data.get("reason", "")
167
- # Handle both targeted shutdown (module_id == "assistant") and broadcast shutdown (no module_id or launcher_lost)
168
- if target == "assistant" or not target or reason == "launcher_lost":
169
- await self._handle_shutdown(ws)
170
- return
171
-
172
- # Layer 2: 忽略系统广播事件
173
- if event_type in SYSTEM_BROADCAST_EVENTS:
174
- continue
175
-
176
- # Layer 3: 警告未知事件(仅开发环境)
177
- if os.environ.get("KITE_ENV") == "development":
178
- print(f"[assistant] Debug: Unhandled event: {event_type}")
179
-
307
+ asyncio.create_task(self._handle_event_notification(msg))
180
308
  elif not has_method and has_id:
181
- # JSON-RPC Response (to our RPC calls)
182
- pass
309
+ self._handle_rpc_response(msg)
183
310
  except Exception as e:
184
- print(f"[assistant] 事件处理异常: {e}")
311
+ print(f"[assistant] Slot {slot} 消息处理异常(已忽略): {e}")
312
+ except Exception as e:
313
+ print(f"[assistant] Slot {slot} recv loop exited: {e}")
314
+ finally:
315
+ self._extra_ws.pop(slot, None)
316
+ self._extra_ws_tasks.pop(slot, None)
317
+
318
+ async def _handle_connection_release(self, data):
319
+ """Kernel 请求释放 slot,优雅关闭。"""
320
+ for slot in data.get("slots", []):
321
+ ws = self._extra_ws.pop(slot, None)
322
+ task = self._extra_ws_tasks.pop(slot, None)
323
+ if ws:
324
+ try:
325
+ await ws.close(code=1000, reason="release")
326
+ except Exception:
327
+ pass
328
+ if task:
329
+ task.cancel()
185
330
 
186
331
  async def _handle_shutdown(self, ws):
187
- """Handle module.shutdown: ack → exiting → cleanupready → exit."""
332
+ """Handle module.shutdown: ack → exiting → readycleanup → exit."""
188
333
  print("[assistant] Received module.shutdown")
189
334
  self._shutting_down = True
190
335
 
191
336
  # Step 1: Send ack (立即确认收到)
192
- await self._rpc_call(ws, "event.publish", {
193
- "event_id": str(uuid.uuid4()),
194
- "event": "module.shutdown.ack",
195
- "data": {"module_id": "assistant", "estimated_cleanup": 2},
337
+ await self._publish_event(ws, "module.shutdown.ack", {
338
+ "module_id": "assistant", "estimated_cleanup": 2,
196
339
  })
197
340
  print("[assistant] shutdown ack sent")
198
341
 
199
342
  # Step 2: Send module.exiting (开始清理)
200
- await self._rpc_call(ws, "event.publish", {
201
- "event_id": str(uuid.uuid4()),
202
- "event": "module.exiting",
203
- "data": {"module_id": "assistant", "action": "none"},
343
+ await self._publish_event(ws, "module.exiting", {
344
+ "module_id": "assistant", "action": "none",
204
345
  })
205
346
 
206
- # Step 3: Cleanup (cancel background tasks)
207
- if self._test_task:
208
- self._test_task.cancel()
209
-
210
- # Step 4: Send ready (清理完成)
211
- await self._rpc_call(ws, "event.publish", {
212
- "event_id": str(uuid.uuid4()),
213
- "event": "module.shutdown.ready",
214
- "data": {"module_id": "assistant"},
347
+ # Step 3: Send ready(必须在关闭连接之前发送)
348
+ await self._publish_event(ws, "module.shutdown.ready", {
349
+ "module_id": "assistant",
215
350
  })
216
351
  print("[assistant] Shutdown ready sent")
217
352
 
218
- # Step 4: Exit process
219
- import sys
220
- sys.exit(0)
353
+ # Step 4: 等待 Kernel 处理 shutdown.ready
354
+ await asyncio.sleep(0.01)
355
+
356
+ # Step 5: Cleanup - 关闭所有附加连接
357
+ for _s, _w in list(self._extra_ws.items()):
358
+ try:
359
+ await _w.close(code=1000, reason="shutdown")
360
+ except Exception:
361
+ pass
362
+ for _t in self._extra_ws_tasks.values():
363
+ _t.cancel()
364
+ self._extra_ws.clear()
365
+ self._extra_ws_tasks.clear()
366
+
367
+ if self._test_task:
368
+ self._test_task.cancel()
221
369
 
222
- async def _rpc_call(self, ws, method: str, params: dict = None):
223
- """Send a JSON-RPC 2.0 request."""
224
- msg = {"jsonrpc": "2.0", "id": str(uuid.uuid4()), "method": method}
370
+ # Step 6: Close WebSocket connection gracefully
371
+ try:
372
+ await ws.close(code=1000, reason="Graceful shutdown")
373
+ print("[assistant] WebSocket closed")
374
+ except Exception as e:
375
+ print(f"[assistant] Failed to close WebSocket: {e}")
376
+
377
+ async def _rpc_call(self, ws, method: str, params: dict = None,
378
+ wait_response: bool = True, timeout: float = 3.0) -> dict:
379
+ """JSON-RPC 2.0 request。默认等待响应。"""
380
+ rpc_id = str(uuid.uuid4())
381
+ msg = {"jsonrpc": "2.0", "id": rpc_id, "method": method}
225
382
  if params:
226
383
  msg["params"] = params
384
+ if not wait_response:
385
+ await ws.send(json.dumps(msg))
386
+ return
387
+ future = asyncio.get_event_loop().create_future()
388
+ self._pending_rpc[rpc_id] = future
227
389
  await ws.send(json.dumps(msg))
390
+ try:
391
+ return await asyncio.wait_for(future, timeout=timeout)
392
+ except asyncio.TimeoutError:
393
+ self._pending_rpc.pop(rpc_id, None)
394
+ return {"error": {"code": -32000, "message": f"RPC timeout: {method} ({timeout}s)"}}
395
+
396
+ def _compute_pressure_level(self) -> str:
397
+ """根据并发处理量计算压力等级。"""
398
+ depth = self._active_handlers + len(self._pending_rpc)
399
+ ratio = depth / self._handler_capacity if self._handler_capacity > 0 else 0
400
+ if ratio >= 0.9:
401
+ return "critical"
402
+ elif ratio >= 0.5:
403
+ return "overload"
404
+ elif depth > 0:
405
+ return "normal"
406
+ return "idle"
407
+
408
+ def _handle_rpc_response(self, msg: dict):
409
+ """Resolve pending RPC future with the response."""
410
+ rpc_id = msg.get("id")
411
+ future = self._pending_rpc.pop(rpc_id, None)
412
+ if future and not future.done():
413
+ future.set_result(msg)
228
414
 
229
415
  async def _handle_ping_event(self, data: dict):
230
416
  """Handle system.ping event and reply with system.pong."""
417
+ if self._ws is None:
418
+ return
231
419
  t1 = data.get("ping_time")
232
420
  t2 = time.time()
233
421
 
234
- await self._rpc_call(self._ws, "event.publish", {
235
- "event_id": str(uuid.uuid4()),
236
- "event": "system.pong",
237
- "data": {
238
- "module_id": "assistant",
239
- "ping_time": t1,
240
- "pong_time": t2,
241
- },
422
+ await self._publish_event(self._ws, "system.pong", {
423
+ "module_id": "assistant",
424
+ "ping_time": t1,
425
+ "pong_time": t2,
242
426
  })
243
427
 
244
428
  def _fmt_elapsed(self, t0: float) -> str:
@@ -250,30 +434,32 @@ class AssistantServer:
250
434
  return f"{d:.1f}s"
251
435
  return f"{d:.0f}s"
252
436
 
253
- async def _publish_event(self, event: dict):
254
- """Publish an event via JSON-RPC event.publish."""
255
- if not self._ws:
256
- return
257
- try:
258
- await self._rpc_call(self._ws, "event.publish", {
259
- "event_id": str(uuid.uuid4()),
260
- "event": event.get("event", ""),
261
- "data": event.get("data", {}),
262
- })
263
- except Exception as e:
264
- print(f"[assistant] Failed to publish event: {e}")
437
+ async def _publish_event(self, ws, event: str, data: dict = None):
438
+ """Publish event via event.publish RPC (fire-and-forget)."""
439
+ await self._rpc_call(ws, "event.publish", {
440
+ "event_id": str(uuid.uuid4()),
441
+ "event": event,
442
+ "data": data or {},
443
+ }, wait_response=False)
265
444
 
266
445
  # ── Test event loop ──
267
446
 
268
447
  async def _test_event_loop(self):
269
448
  """Publish a test event every 10 seconds."""
270
- while True:
271
- await asyncio.sleep(10)
272
- await self._publish_event({
273
- "event": "assistant.test",
274
- "data": {
275
- "message": "test event from assistant",
276
- "timestamp": datetime.now(timezone.utc).isoformat(),
277
- },
278
- })
279
- print("[assistant] test event published")
449
+ try:
450
+ while True:
451
+ await asyncio.sleep(10)
452
+ if self._ws:
453
+ await self._publish_event(self._ws, "assistant.test", {
454
+ "message": "test event from assistant",
455
+ "timestamp": datetime.now(timezone.utc).isoformat(),
456
+ })
457
+ # 上报队列压力(供 Kernel 自动缩容决策)
458
+ depth = self._active_handlers + len(self._pending_rpc)
459
+ await self._publish_event(self._ws, "module.queue_pressure", {
460
+ "level": self._compute_pressure_level(),
461
+ "depth": depth,
462
+ "capacity": self._handler_capacity,
463
+ })
464
+ except Exception:
465
+ pass
@@ -116,6 +116,12 @@ def _load_module_config() -> dict:
116
116
  if "advertise_ip" in fm:
117
117
  result["advertise_ip"] = str(fm["advertise_ip"])
118
118
 
119
+ # max_connections(弹性连接上限)
120
+ try:
121
+ result["max_connections"] = max(1, min(10, int(fm.get("max_connections", 1))))
122
+ except (ValueError, TypeError):
123
+ result["max_connections"] = 1
124
+
119
125
  except SystemExit:
120
126
  raise # Re-raise exit to prevent catching by outer except
121
127
  except Exception as e:
@@ -364,7 +370,7 @@ def _read_stdin_kite_message(expected_type: str, timeout: float = 10) -> dict |
364
370
  return result[0]
365
371
 
366
372
 
367
- def main():
373
+ def _run_local_mode(kernel_port: int):
368
374
  # Initialize log file paths
369
375
  global _log_dir, _log_latest_path, _crash_log_path
370
376
  module_data = os.environ.get("KITE_MODULE_DATA")
@@ -394,35 +400,49 @@ def main():
394
400
  _t0 = time.monotonic()
395
401
 
396
402
  # Read boot_info from stdin (only token)
397
- token = ""
403
+ line = sys.stdin.readline().strip()
404
+ if not line:
405
+ print(f"[{MODULE_NAME}] ERROR: stdin closed")
406
+ sys.exit(1)
407
+
398
408
  try:
399
- line = sys.stdin.readline().strip()
400
- if line:
401
- boot_info = json.loads(line)
402
- token = boot_info.get("token", "")
403
- except Exception:
404
- pass
405
-
406
- # Read kernel_port: env first (fast path), stdin fallback (parallel start)
407
- kernel_port = int(os.environ.get("KITE_KERNEL_PORT", "0"))
409
+ msg = json.loads(line)
410
+ except json.JSONDecodeError as e:
411
+ print(f"[{MODULE_NAME}] ERROR: Invalid JSON from stdin: {e}")
412
+ sys.exit(1)
413
+
414
+ if "error" in msg:
415
+ print(f"[{MODULE_NAME}] 启动失败: {msg.get('message', 'unknown')}")
416
+ sys.exit(1)
417
+
418
+ token = msg.get("token", "")
419
+ max_instances = msg.get("max_instances", 1)
420
+ instance_elastic = msg.get("instance_elastic", False)
421
+ if not token:
422
+ print(f"[{MODULE_NAME}] ERROR: No token in stdin message")
423
+ sys.exit(1)
424
+
408
425
  if not kernel_port:
409
426
  msg = _read_stdin_kite_message("kernel_port", timeout=10)
410
427
  if msg:
411
428
  kernel_port = int(msg.get("kernel_port", 0))
412
429
 
413
- if not token or not kernel_port:
414
- print("[acp_channel] ERROR: Missing token or kernel_port")
430
+ if not kernel_port:
431
+ print(f"[{MODULE_NAME}] ERROR: Missing kernel_port")
415
432
  sys.exit(1)
416
433
 
417
- print(f"[acp_channel] Token received ({len(token)} chars), kernel port: {kernel_port} ({_fmt_elapsed(_t0)})")
434
+ print(f"[{MODULE_NAME}] Local mode: port={kernel_port} ({_fmt_elapsed(_t0)})")
418
435
 
419
436
  server = AcpChannelServer(
420
437
  token=token,
421
438
  kernel_port=kernel_port,
422
439
  boot_t0=_t0,
440
+ max_connections=_module_config.get("max_connections", 1),
441
+ max_instances=max_instances,
442
+ instance_elastic=instance_elastic,
423
443
  )
424
444
 
425
- print(f"[acp_channel] Starting ({_fmt_elapsed(_t0)})")
445
+ print(f"[{MODULE_NAME}] Starting ({_fmt_elapsed(_t0)})")
426
446
  try:
427
447
  asyncio.run(server.run())
428
448
  except Exception as e:
@@ -435,5 +455,83 @@ def main():
435
455
  sys.exit(server._exit_code)
436
456
 
437
457
 
458
+ def _run_remote_mode(gateway_url: str):
459
+ global _log_dir, _log_latest_path, _crash_log_path
460
+ home = os.environ.get("HOME") or os.environ.get("USERPROFILE") or os.path.expanduser("~")
461
+ data_dir = os.path.join(home, ".kite", "remote", MODULE_NAME)
462
+ os.makedirs(data_dir, exist_ok=True)
463
+ _log_dir = os.path.join(data_dir, "log")
464
+ os.makedirs(_log_dir, exist_ok=True)
465
+ _log_latest_path = os.path.join(_log_dir, "latest.log")
466
+ try:
467
+ with open(_log_latest_path, "w", encoding="utf-8") as f: pass
468
+ except Exception: _log_latest_path = None
469
+ _crash_log_path = os.path.join(_log_dir, "crashes.jsonl")
470
+ try:
471
+ with open(_crash_log_path, "w", encoding="utf-8") as f: pass
472
+ except Exception: _crash_log_path = None
473
+ _resolve_daily_log_path()
474
+ _setup_exception_hooks()
475
+ _t0 = time.monotonic()
476
+ kite_token = _get_kite_token(MODULE_NAME, gateway_url)
477
+ print(f"[{MODULE_NAME}] Remote mode: gateway={gateway_url}")
478
+ server = AcpChannelServer(token=None, kernel_port=0, boot_t0=_t0,
479
+ max_connections=_module_config.get("max_connections", 1),
480
+ gateway_url=gateway_url, kite_token=kite_token)
481
+ try:
482
+ asyncio.run(server.run())
483
+ except Exception as e:
484
+ _write_crash(type(e), e, e.__traceback__, severity="critical", handled=True)
485
+ _print_crash_summary(type(e), e.__traceback__)
486
+ sys.exit(1)
487
+ if hasattr(server, '_auth_failed') and server._auth_failed:
488
+ _clear_token_cache(MODULE_NAME, gateway_url)
489
+ if server._exit_code != 0:
490
+ sys.exit(server._exit_code)
491
+
492
+
493
+ def _gateway_to_filename(gateway_url: str) -> str:
494
+ try:
495
+ from urllib.parse import urlparse
496
+ parsed = urlparse(gateway_url)
497
+ host = parsed.hostname or "unknown"
498
+ port = parsed.port or (443 if parsed.scheme == "wss" else 80)
499
+ return f"{host}-{port}.json".replace(":", "-").replace("/", "-")
500
+ except Exception: return "default.json"
501
+
502
+ def _load_token_cache(module_name: str, gateway_url: str) -> dict | None:
503
+ home = os.environ.get("HOME") or os.environ.get("USERPROFILE") or os.path.expanduser("~")
504
+ token_file = os.path.join(home, ".kite", "remote", module_name, "tokens", _gateway_to_filename(gateway_url))
505
+ if not os.path.exists(token_file): return None
506
+ try:
507
+ with open(token_file, "r") as f: return json.load(f)
508
+ except Exception: return None
509
+
510
+ def _clear_token_cache(module_name: str, gateway_url: str):
511
+ home = os.environ.get("HOME") or os.environ.get("USERPROFILE") or os.path.expanduser("~")
512
+ token_file = os.path.join(home, ".kite", "remote", module_name, "tokens", _gateway_to_filename(gateway_url))
513
+ try: os.remove(token_file)
514
+ except Exception: pass
515
+
516
+ def _get_kite_token(module_name: str, gateway_url: str) -> str:
517
+ token = os.environ.get("KITE_TOKEN")
518
+ if token: return token
519
+ cache = _load_token_cache(module_name, gateway_url)
520
+ if cache: return cache["token"]
521
+ print(f"[{module_name}] No token for {gateway_url}")
522
+ print(f" export KITE_TOKEN=<token>")
523
+ sys.exit(1)
524
+
525
+
438
526
  if __name__ == "__main__":
439
- main()
527
+ kernel_port = os.environ.get("KITE_KERNEL_PORT")
528
+ if kernel_port:
529
+ _run_local_mode(int(kernel_port))
530
+ else:
531
+ config = _load_module_config()
532
+ gateway_url = config.get("gateway_url") or os.environ.get("KITE_GATEWAY_URL")
533
+ if gateway_url:
534
+ _run_remote_mode(gateway_url)
535
+ else:
536
+ print(f"[{MODULE_NAME}] ERROR: No KITE_KERNEL_PORT and no gateway_url")
537
+ sys.exit(1)