@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
@@ -4,6 +4,9 @@ display_name: ACP Channel
4
4
  version: '1.0'
5
5
  type: channel
6
6
  state: enabled
7
+ max_connections: 3
8
+ max_instances: 3
9
+ instance_elastic: false
7
10
  runtime: python
8
11
  entry: entry.py
9
12
  events:
@@ -14,6 +17,7 @@ subscriptions:
14
17
  - module.shutdown
15
18
  advertise_ip: 127.0.0.1
16
19
  monitor: true
20
+ connection_elastic: false
17
21
  ---
18
22
  # ACP Channel(ACP 协议通道)
19
23
 
@@ -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 AcpChannelServer:
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._pending_rpc = {} # Track pending RPC calls: {id: future}
47
+ self._extra_ws: dict = {} # slot → WebSocket
48
+ self._extra_ws_tasks: dict = {} # slot → recv loop Task
49
+ self._has_registered = False
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 AcpChannelServer:
71
86
  if code in (4001, 4003):
72
87
  print(f"[acp_channel] 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:
@@ -80,31 +96,111 @@ class AcpChannelServer:
80
96
  return
81
97
  print(f"[acp_channel] Kernel connection error: {e}, retrying in {retry_delay:.1f}s ({attempt}/{max_retries})")
82
98
  self._ws = None
99
+ self._cancel_pending_rpc()
83
100
  if self._shutting_down:
84
101
  return
85
102
  await asyncio.sleep(retry_delay)
86
103
  retry_delay = min(retry_delay * 2, max_delay)
87
104
 
88
105
  async def _ws_connect(self):
89
- """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=acp_channel"
106
+ """Single WebSocket session: connect, auth, start receiver, subscribe, register, ready."""
107
+ url = f"ws://127.0.0.1:{self.kernel_port}/ws?id=acp_channel"
91
108
  print(f"[acp_channel] Connecting to Kernel (port {self.kernel_port})")
92
109
  async with websockets.connect(url, open_timeout=3, ping_interval=None, close_timeout=10) as ws:
110
+ # Send auth message first
111
+ auth_req = {
112
+ "jsonrpc": "2.0",
113
+ "id": "auth",
114
+ "method": "auth",
115
+ "params": {"token": self.token}
116
+ }
117
+ await ws.send(json.dumps(auth_req))
118
+
119
+ # Wait for auth response
120
+ auth_resp_raw = await asyncio.wait_for(ws.recv(), timeout=5)
121
+ auth_resp = json.loads(auth_resp_raw)
122
+ if "error" in auth_resp:
123
+ raise Exception(f"Auth failed: {auth_resp['error']}")
124
+
93
125
  self._ws = ws
94
126
  elapsed = time.monotonic() - self.boot_t0 if self.boot_t0 else 0
95
127
  elapsed_str = f" ({elapsed:.1f}s)" if elapsed else ""
96
128
  print(f"[acp_channel] Connected to Kernel{elapsed_str}")
97
129
 
98
- # Step 1: Subscribe to events (先订阅)
130
+ # 启动接收循环(先于 RPC 调用,防止 wait_response 死锁)
131
+ recv_task = asyncio.create_task(self._ws_receiver(ws))
132
+
133
+ try:
134
+ # subscribe/register/module.ready 由 _do_init 在收到 system.require_init 后执行
135
+
136
+ # 等待接收循环结束(连接断开时自然退出)
137
+ await recv_task
138
+ finally:
139
+ recv_task.cancel()
140
+ self._cancel_pending_rpc()
141
+
142
+ async def _ws_receiver(self, ws):
143
+ """Receive loop: dispatch RPC requests, event notifications, and RPC responses.
144
+
145
+ CRITICAL: RPC 死锁防范
146
+ - 入站 RPC 请求必须用 create_task() 异步执行,不可 await
147
+ - 原因:如果 handler 内部调用 rpc_call() 发出站请求,出站响应需要本接收循环来分发
148
+ - 如果接收循环被 await handler 阻塞,出站响应永远收不到 → 超时死锁
149
+ """
150
+ try:
151
+ async for raw in ws:
152
+ try:
153
+ msg = json.loads(raw)
154
+ except (json.JSONDecodeError, TypeError):
155
+ continue
156
+
157
+ try:
158
+ has_method = "method" in msg
159
+ has_id = "id" in msg
160
+
161
+ # 检测 system.require_init 事件,触发注册流程
162
+ if has_method and not has_id:
163
+ params = msg.get("params", {})
164
+ event = params.get("event", "")
165
+ if event == "system.require_init":
166
+ asyncio.create_task(self._do_init(ws))
167
+ continue
168
+
169
+ if has_method and has_id:
170
+ asyncio.create_task(self._handle_rpc_request(ws, msg))
171
+ elif has_method and not has_id:
172
+ asyncio.create_task(self._handle_event_notification(msg))
173
+ elif not has_method and has_id:
174
+ self._handle_rpc_response(msg)
175
+ except Exception as e:
176
+ print(f"[acp_channel] 消息处理异常(已忽略): {e}")
177
+ except websockets.exceptions.ConnectionClosed:
178
+ pass # Kernel 连接关闭,正常退出接收循环
179
+
180
+ async def _do_init(self, ws):
181
+ """收到 system.require_init 后执行:订阅 + 注册 + module.ready"""
182
+ try:
183
+ reason = "startup" if not self._has_registered else "recovery"
184
+
185
+ # Step 1: Subscribe to events
99
186
  await self._rpc_call(ws, "event.subscribe", {
100
- "events": ["module.started", "module.stopped", "module.shutdown"],
187
+ "events": ["module.started", "module.stopped", "module.shutdown", "phone_channel.test"],
101
188
  })
102
189
 
103
- # Step 2: Register to Kernel (再注册)
190
+ # Step 2: Register to Kernel
104
191
  await self._rpc_call(ws, "registry.register", {
105
192
  "module_id": "acp_channel",
106
193
  "module_type": "channel",
107
194
  "name": "ACP Channel",
195
+ "tools": {
196
+ "rpc": {
197
+ "module": {
198
+ "echo": {"method": "echo", "description": "Echo test"},
199
+ "get_status": {"method": "get_status", "description": "Get channel status"},
200
+ "nested_call": {"method": "nested_call", "description": "Nested RPC call test"},
201
+ }
202
+ }
203
+ },
108
204
  "events_publish": {
109
205
  "acp_channel": {
110
206
  "test": {},
@@ -114,131 +210,285 @@ class AcpChannelServer:
114
210
  "module.started",
115
211
  "module.stopped",
116
212
  "module.shutdown",
213
+ "phone_channel.test",
117
214
  ],
118
215
  })
119
216
 
120
- # Step 3: Publish module.ready (every reconnect)
217
+ # Step 3: Publish module.ready
121
218
  if not self._shutting_down:
122
219
  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": "acp_channel",
128
- "graceful_shutdown": True,
129
- "startup_time": startup_time,
130
- },
220
+ await self._publish_event(ws, "module.ready", {
221
+ "module_id": "acp_channel",
222
+ "graceful_shutdown": True,
223
+ "startup_time": startup_time,
224
+ "reason": reason,
131
225
  })
132
226
  elapsed_str = self._fmt_elapsed(self.boot_t0)
133
- print(f"[acp_channel] module.ready published ({elapsed_str})")
227
+ print(f"[acp_channel] module.ready published (reason={reason}, {elapsed_str})")
228
+ self._has_registered = True
229
+ except Exception as e:
230
+ print(f"[acp_channel] _do_init failed: {e}")
231
+ self._has_registered = False
232
+
233
+ async def _handle_event_notification(self, msg: dict):
234
+ """Handle an event notification (JSON-RPC 2.0 Notification with method='event')."""
235
+ params = msg.get("params", {})
236
+ event_type = params.get("event", "")
237
+ data = params.get("data", {})
238
+
239
+ # Handle system.ping event
240
+ if event_type == "system.ping":
241
+ await self._handle_ping_event(data)
242
+ return
134
243
 
135
- # Receive loop
136
- # CRITICAL: RPC 死锁防范
137
- # - 入站 RPC 请求必须用 create_task() 异步执行,不可 await
138
- # - 原因:如果 handler 内部调用 rpc_call() 发出站请求,出站响应需要本接收循环来分发
139
- # - 如果接收循环被 await handler 阻塞,出站响应永远收不到 → 超时死锁
140
- # - 事件通知和 RPC 响应可以同步处理(它们不会反向调用 rpc_call)
244
+ # 弹性连接 offer/release
245
+ if event_type == "system.connection.offer":
246
+ asyncio.create_task(self._handle_connection_offer(data))
247
+ return
248
+ if event_type == "system.connection.release":
249
+ asyncio.create_task(self._handle_connection_release(data))
250
+ return
251
+
252
+ # Handle phone_channel.test event (跨模块事件测试)
253
+ if event_type == "phone_channel.test":
254
+ print(f"[acp_channel] 收到 phone_channel.test 事件: {data.get('message', '')}")
255
+ return
256
+
257
+ # Layer 1: 处理订阅的事件
258
+ if event_type == "module.shutdown":
259
+ target = data.get("module_id", "")
260
+ reason = data.get("reason", "")
261
+ # Handle both targeted shutdown (module_id == "acp_channel") and broadcast shutdown (no module_id or launcher_lost)
262
+ if target.startswith("acp_channel") or not target or reason == "launcher_lost":
263
+ await self._handle_shutdown(self._ws)
264
+ return
141
265
 
266
+ # Layer 2: 忽略系统广播事件
267
+ if event_type in SYSTEM_BROADCAST_EVENTS:
268
+ return
269
+
270
+ # Layer 3: 警告未知事件(仅开发环境)
271
+ if os.environ.get("KITE_ENV") == "development":
272
+ print(f"[acp_channel] Debug: Unhandled event: {event_type}")
273
+
274
+ async def _handle_connection_offer(self, data):
275
+ """处理 Kernel 下发的 slot token,建立附加连接。"""
276
+ slots = data.get("slots", {})
277
+ for slot_str, info in slots.items():
278
+ slot = int(slot_str)
279
+ token = info.get("token", "")
280
+ if not token or slot in self._extra_ws:
281
+ continue
282
+ asyncio.create_task(self._connect_slot(slot, token))
283
+
284
+ async def _connect_slot(self, slot, token):
285
+ """建立单个 slot 附加连接。"""
286
+ ws_url = f"ws://127.0.0.1:{self.kernel_port}/ws"
287
+ try:
288
+ ws = await websockets.connect(ws_url, open_timeout=5, ping_interval=None, close_timeout=5)
289
+ auth_req = {"jsonrpc": "2.0", "id": f"auth-slot-{slot}", "method": "auth", "params": {"token": token}}
290
+ await ws.send(json.dumps(auth_req))
291
+ resp = json.loads(await asyncio.wait_for(ws.recv(), timeout=5))
292
+ if "error" in resp:
293
+ await ws.close()
294
+ return
295
+ self._extra_ws[slot] = ws
296
+ self._extra_ws_tasks[slot] = asyncio.create_task(self._slot_recv_loop(slot, ws))
297
+ print(f"[acp_channel] Slot {slot} connected")
298
+ except Exception as e:
299
+ print(f"[acp_channel] Slot {slot} connect failed: {e}")
300
+
301
+ async def _slot_recv_loop(self, slot, ws):
302
+ """附加连接的接收循环:与主连接平等处理所有消息。"""
303
+ try:
142
304
  async for raw in ws:
143
305
  try:
144
306
  msg = json.loads(raw)
145
307
  except (json.JSONDecodeError, TypeError):
146
308
  continue
147
-
148
309
  try:
149
310
  has_method = "method" in msg
150
311
  has_id = "id" in msg
151
-
152
- 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 == "acp_channel") and broadcast shutdown (no module_id or launcher_lost)
168
- if target == "acp_channel" 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"[acp_channel] Debug: Unhandled event: {event_type}")
179
-
312
+ if has_method and has_id:
313
+ asyncio.create_task(self._handle_rpc_request(ws, msg))
314
+ elif has_method and not has_id:
315
+ asyncio.create_task(self._handle_event_notification(msg))
180
316
  elif not has_method and has_id:
181
- # JSON-RPC Response (to our RPC calls)
182
- pass
317
+ self._handle_rpc_response(msg)
183
318
  except Exception as e:
184
- print(f"[acp_channel] 事件处理异常(已忽略): {e}")
319
+ print(f"[acp_channel] Slot {slot} 消息处理异常(已忽略): {e}")
320
+ except Exception:
321
+ pass
322
+ finally:
323
+ self._extra_ws.pop(slot, None)
324
+ self._extra_ws_tasks.pop(slot, None)
325
+
326
+ async def _handle_connection_release(self, data):
327
+ """Kernel 请求释放 slot,优雅关闭。"""
328
+ for slot in data.get("slots", []):
329
+ ws = self._extra_ws.pop(slot, None)
330
+ task = self._extra_ws_tasks.pop(slot, None)
331
+ if ws:
332
+ try:
333
+ await ws.close(code=1000, reason="release")
334
+ except Exception:
335
+ pass
336
+ if task:
337
+ task.cancel()
185
338
 
186
339
  async def _handle_shutdown(self, ws):
187
- """Handle module.shutdown: ack → exiting → cleanupready → exit."""
340
+ """Handle module.shutdown: ack → exiting → readycleanup → exit."""
188
341
  print("[acp_channel] Received module.shutdown")
189
342
  self._shutting_down = True
190
343
 
191
344
  # 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": "acp_channel", "estimated_cleanup": 2},
345
+ await self._publish_event(ws, "module.shutdown.ack", {
346
+ "module_id": "acp_channel", "estimated_cleanup": 2,
196
347
  })
197
348
  print("[acp_channel] shutdown ack sent")
198
349
 
199
350
  # 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": "acp_channel", "action": "none"},
351
+ await self._publish_event(ws, "module.exiting", {
352
+ "module_id": "acp_channel", "action": "none",
353
+ })
354
+
355
+ # Step 3: Send ready(必须在关闭连接之前发送)
356
+ await self._publish_event(ws, "module.shutdown.ready", {
357
+ "module_id": "acp_channel",
204
358
  })
359
+ print("[acp_channel] Shutdown ready sent")
360
+
361
+ # Step 4: 等待 Kernel 处理 shutdown.ready
362
+ await asyncio.sleep(0.01)
363
+
364
+ # Step 5: Cleanup - 关闭所有附加连接
365
+ for _s, _w in list(self._extra_ws.items()):
366
+ try:
367
+ await _w.close(code=1000, reason="shutdown")
368
+ except Exception:
369
+ pass
370
+ for _t in self._extra_ws_tasks.values():
371
+ _t.cancel()
372
+ self._extra_ws.clear()
373
+ self._extra_ws_tasks.clear()
205
374
 
206
- # Step 3: Cleanup (cancel background tasks)
207
375
  if self._test_task:
208
376
  self._test_task.cancel()
209
377
 
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": "acp_channel"},
215
- })
216
- print("[acp_channel] Shutdown ready sent")
378
+ # Step 6: Close WebSocket connection gracefully
379
+ try:
380
+ await ws.close(code=1000, reason="Graceful shutdown")
381
+ print("[acp_channel] WebSocket closed")
382
+ except Exception as e:
383
+ print(f"[acp_channel] Failed to close WebSocket: {e}")
217
384
 
218
- # Step 4: Exit process
219
- import sys
220
- sys.exit(0)
385
+ async def _handle_rpc_request(self, ws, msg: dict):
386
+ """Handle incoming RPC request."""
387
+ method = msg.get("method", "")
388
+ params = msg.get("params", {})
389
+ req_id = msg.get("id")
221
390
 
222
- async def _rpc_call(self, ws, method: str, params: dict = None):
391
+ self._active_handlers += 1
392
+ try:
393
+ # 支持带前缀和不带前缀的方法名
394
+ bare_method = method.split(".")[-1] if "." in method else method
395
+
396
+ if bare_method == "echo":
397
+ result = {"echo": params.get("message", ""), "timestamp": time.time()}
398
+ elif bare_method == "get_status":
399
+ result = {
400
+ "status": "running",
401
+ "uptime": time.time() - self._start_time,
402
+ "module_id": "acp_channel",
403
+ }
404
+ elif bare_method == "nested_call":
405
+ # 嵌套调用:调用 phone_channel.echo
406
+ message = params.get("message", "")
407
+ print(f"[acp_channel] 嵌套调用: 准备调用 phone_channel.echo")
408
+ nested_result = await self._call_remote_rpc(
409
+ "phone_channel",
410
+ "echo",
411
+ {"message": f"nested from acp: {message}"}
412
+ )
413
+ result = {
414
+ "module_id": "acp_channel",
415
+ "nested_call_to": "phone_channel.echo",
416
+ "nested_result": nested_result,
417
+ "original_message": message
418
+ }
419
+ else:
420
+ raise Exception(f"Unknown method: {method}")
421
+
422
+ response = {"jsonrpc": "2.0", "id": req_id, "result": result}
423
+ await ws.send(json.dumps(response))
424
+ print(f"[acp_channel] RPC 请求处理: {method}")
425
+ except Exception as e:
426
+ error_response = {
427
+ "jsonrpc": "2.0",
428
+ "id": req_id,
429
+ "error": {"code": -32603, "message": str(e)},
430
+ }
431
+ await ws.send(json.dumps(error_response))
432
+ print(f"[acp_channel] RPC 请求失败: {method} - {e}")
433
+ finally:
434
+ self._active_handlers -= 1
435
+
436
+ def _compute_pressure_level(self) -> str:
437
+ """根据并发处理量计算压力等级。"""
438
+ depth = self._active_handlers + len(self._pending_rpc)
439
+ ratio = depth / self._handler_capacity if self._handler_capacity > 0 else 0
440
+ if ratio >= 0.9:
441
+ return "critical"
442
+ elif ratio >= 0.5:
443
+ return "overload"
444
+ elif depth > 0:
445
+ return "normal"
446
+ return "idle"
447
+
448
+ def _handle_rpc_response(self, msg: dict):
449
+ """Handle RPC response (resolve pending future with full msg)."""
450
+ rpc_id = msg.get("id")
451
+ future = self._pending_rpc.pop(rpc_id, None)
452
+ if future and not future.done():
453
+ future.set_result(msg)
454
+
455
+ def _cancel_pending_rpc(self):
456
+ """Cancel all pending RPC futures on disconnect."""
457
+ for rpc_id, future in self._pending_rpc.items():
458
+ if not future.done():
459
+ future.cancel()
460
+ self._pending_rpc.clear()
461
+
462
+ async def _rpc_call(self, ws, method: str, params: dict = None,
463
+ wait_response: bool = True, timeout: float = 3.0) -> dict:
223
464
  """Send a JSON-RPC 2.0 request."""
224
- msg = {"jsonrpc": "2.0", "id": str(uuid.uuid4()), "method": method}
465
+ req_id = str(uuid.uuid4())
466
+ msg = {"jsonrpc": "2.0", "id": req_id, "method": method}
225
467
  if params:
226
468
  msg["params"] = params
227
- await ws.send(json.dumps(msg))
469
+
470
+ if wait_response:
471
+ future = asyncio.Future()
472
+ self._pending_rpc[req_id] = future
473
+ await ws.send(json.dumps(msg))
474
+ try:
475
+ result = await asyncio.wait_for(future, timeout=timeout)
476
+ return result
477
+ except asyncio.TimeoutError:
478
+ self._pending_rpc.pop(req_id, None)
479
+ raise Exception(f"RPC timeout: {method}")
480
+ else:
481
+ await ws.send(json.dumps(msg))
228
482
 
229
483
  async def _handle_ping_event(self, data: dict):
230
484
  """Handle system.ping event and reply with system.pong."""
231
485
  t1 = data.get("ping_time")
232
486
  t2 = time.time()
233
487
 
234
- await self._rpc_call(self._ws, "event.publish", {
235
- "event_id": str(uuid.uuid4()),
236
- "event": "system.pong",
237
- "data": {
238
- "module_id": "acp_channel",
239
- "ping_time": t1,
240
- "pong_time": t2,
241
- },
488
+ await self._publish_event(self._ws, "system.pong", {
489
+ "module_id": "acp_channel",
490
+ "ping_time": t1,
491
+ "pong_time": t2,
242
492
  })
243
493
 
244
494
  def _fmt_elapsed(self, t0: float) -> str:
@@ -250,30 +500,71 @@ class AcpChannelServer:
250
500
  return f"{d:.1f}s"
251
501
  return f"{d:.0f}s"
252
502
 
253
- async def _publish_event(self, event: dict):
254
- """Publish an event via JSON-RPC event.publish."""
503
+ async def _publish_event(self, ws, event: str, data: dict = None):
504
+ """Publish event via event.publish RPC (fire-and-forget)."""
505
+ await self._rpc_call(ws, "event.publish", {
506
+ "event_id": str(uuid.uuid4()),
507
+ "event": event,
508
+ "data": data or {},
509
+ }, wait_response=False)
510
+
511
+ async def _call_remote_rpc(self, target_module: str, method: str, params: dict = None):
512
+ """Call RPC method on another module via Kernel."""
255
513
  if not self._ws:
256
- return
514
+ return None
257
515
  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
- })
516
+ result = await self._rpc_call(
517
+ self._ws,
518
+ f"{target_module}.{method}",
519
+ params or {},
520
+ wait_response=True
521
+ )
522
+ if result and "error" in result:
523
+ err = result["error"]
524
+ print(f"[acp_channel] 跨模块 RPC 调用失败 ({target_module}.{method}): {err.get('message', 'RPC error')}")
525
+ return None
526
+ return result.get("result") if result else None
263
527
  except Exception as e:
264
- print(f"[acp_channel] Failed to publish event: {e}")
528
+ print(f"[acp_channel] 跨模块 RPC 调用失败 ({target_module}.{method}): {e}")
529
+ return None
265
530
 
266
531
  # ── Test event loop ──
267
532
 
268
533
  async def _test_event_loop(self):
269
- """Publish a test event every 10 seconds."""
270
- while True:
271
- await asyncio.sleep(10)
272
- await self._publish_event({
273
- "event": "acp_channel.test",
274
- "data": {
275
- "message": "test event from acp_channel",
534
+ """Publish test events and call cross-module RPC every 12 seconds."""
535
+ try:
536
+ await asyncio.sleep(3) # Wait for initial setup
537
+ counter = 0
538
+ while not self._shutting_down:
539
+ counter += 1
540
+
541
+ # Test 1: Publish event
542
+ if self._ws:
543
+ await self._publish_event(self._ws, "acp_channel.test", {
544
+ "message": f"test event from acp_channel #{counter}",
276
545
  "timestamp": datetime.now(timezone.utc).isoformat(),
277
- },
278
- })
279
- print("[acp_channel] test event published")
546
+ })
547
+
548
+ # Test 2: Call phone_channel RPC (every other cycle)
549
+ if counter % 2 == 1:
550
+ print(f"[acp_channel] 测试跨模块 RPC 调用 phone_channel.get_status")
551
+ result = await self._call_remote_rpc(
552
+ "phone_channel",
553
+ "get_status",
554
+ {}
555
+ )
556
+ if result:
557
+ print(f"[acp_channel] phone_channel.get_status 返回: {result}")
558
+
559
+ # 上报队列压力(供 Kernel 自动缩容决策)
560
+ if self._ws:
561
+ depth = self._active_handlers + len(self._pending_rpc)
562
+ await self._publish_event(self._ws, "module.queue_pressure", {
563
+ "level": self._compute_pressure_level(),
564
+ "depth": depth,
565
+ "capacity": self._handler_capacity,
566
+ })
567
+
568
+ await asyncio.sleep(12)
569
+ except Exception:
570
+ pass