@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
@@ -1,3 +1,10 @@
1
+ """
2
+ configPresenter - Proxy 模块适配版
3
+
4
+ 存储路径改用 KITE_MODULE_DATA,移除对 userPresenter/workPresenter 的依赖。
5
+ 保留 proxy 需要的配置读取方法。
6
+ """
7
+
1
8
  import json
2
9
  import os
3
10
  import threading
@@ -5,35 +12,40 @@ import time
5
12
 
6
13
  from ..log import logger
7
14
 
15
+
8
16
  class configPresenter:
9
17
  _lock = threading.Lock()
10
- _config_dir_initialized = False
18
+ _config_dir_initialized = False
11
19
  searchPreviewEnabled = False
12
20
  userName = "default"
13
- KEY_CLAUDE_AGENT_NAME = "claude_agent_name" # Claude代理Agent名称
14
- KEY_GEMINI_AGENT_NAME = "gemini_agent_name" # Gemini代理Agent名称
15
-
21
+ KEY_CLAUDE_AGENT_NAME = "claude_agent_name"
22
+ KEY_GEMINI_AGENT_NAME = "gemini_agent_name"
23
+
24
+ # 代理模式下的 evol_token(由 auth_bridge 注入)
25
+ _evol_token = None
26
+ _evol_token_lock = threading.Lock()
27
+
16
28
  @staticmethod
17
29
  def get_config_dir():
18
- """获取配置文件目录,确保PyInstaller打包后也能正常工作"""
19
- import platform
30
+ """获取配置目录:优先使用 KITE_MODULE_DATA"""
31
+ module_data = os.environ.get("KITE_MODULE_DATA", "")
32
+ if module_data:
33
+ return os.path.join(module_data, "config")
20
34
 
35
+ import platform
21
36
  if platform.system() == "Windows":
22
- app_path = os.path.join(os.getenv("APPDATA", "~"), "evol",configPresenter.userName)
37
+ app_path = os.path.join(os.getenv("APPDATA", "~"), "evol", configPresenter.userName)
23
38
  else:
24
39
  home_dir = os.path.expanduser("~")
25
40
  if os.access(home_dir, os.W_OK):
26
- app_path = os.path.join(home_dir, ".evol",configPresenter.userName)
27
-
41
+ app_path = os.path.join(home_dir, ".evol", configPresenter.userName)
28
42
  else:
29
43
  import tempfile
30
- app_path = os.path.join(tempfile.gettempdir(), "evol",configPresenter.userName)
31
- logger.debug(f"using config dir: {app_path}")
44
+ app_path = os.path.join(tempfile.gettempdir(), "evol", configPresenter.userName)
32
45
  return app_path
33
46
 
34
47
  @staticmethod
35
48
  def ensure_config_dir():
36
- """确保配置目录存在,只在需要时创建一次"""
37
49
  if not configPresenter._config_dir_initialized:
38
50
  config_dir = configPresenter.get_config_dir()
39
51
  try:
@@ -41,149 +53,89 @@ class configPresenter:
41
53
  configPresenter._config_dir_initialized = True
42
54
  except Exception as e:
43
55
  print(f"创建配置目录失败: {e}")
44
- # 降级到临时目录
45
- import tempfile
46
-
47
- config_dir = tempfile.gettempdir()
48
56
  return True
49
-
57
+
50
58
  @staticmethod
51
59
  def get_claude_agent_name():
52
- """获取Claude智能体名称"""
53
- """获取Claude代理Agent名称,如果未设置则返回默认值"""
54
- #return "claude_code_proxy.aid.pub"
55
60
  agent_name = configPresenter.getSetting(configPresenter.KEY_CLAUDE_AGENT_NAME)
56
61
  if agent_name is None:
57
- return "claude_code_proxy_1.aid.pub" # 默认值
58
- #return "claude_code_proxy.aid.pub"
62
+ return "claude_code_proxy_1.aid.pub"
59
63
  return agent_name
60
64
 
61
65
  @staticmethod
62
66
  def get_gemini_agent_name():
63
- """获取Gemini智能体名称"""
64
- """获取Gemini代理Agent名称,如果未设置则返回默认值"""
65
67
  agent_name = configPresenter.getSetting(configPresenter.KEY_GEMINI_AGENT_NAME)
66
68
  if agent_name is None:
67
- return "gemini_proxy.aid.pub" # 默认值
69
+ return "gemini_proxy.aid.pub"
68
70
  return agent_name
69
71
 
70
-
71
72
  @staticmethod
72
- def get_config_file_path(workspaceName = ""):
73
- """获取配置文件的完整路径"""
74
- if not workspaceName:
75
- configPresenter.ensure_config_dir() # 确保目录存在
76
- config_dir = configPresenter.get_config_dir()
77
- return os.path.join(config_dir, "key_value_store.json")
78
- else:
79
- from evol.presenter.workPresenter import workPresenter
80
- workspace = workPresenter.get_evol_workspace_path(workspaceName)
81
- return os.path.join(workspace, "key_value_store.json")
73
+ def get_config_file_path(workspaceName=""):
74
+ configPresenter.ensure_config_dir()
75
+ config_dir = configPresenter.get_config_dir()
76
+ return os.path.join(config_dir, "key_value_store.json")
82
77
 
83
78
  @staticmethod
84
- def getSetting(key,workspaceName = ""):
85
- """
86
- 从本地文件读取指定键的值
87
- """
79
+ def getSetting(key, workspaceName=""):
88
80
  filepath = configPresenter.get_config_file_path(workspaceName)
89
81
  try:
90
82
  with open(filepath, "r", encoding="utf-8") as f:
91
83
  content = f.read().strip()
92
- if not content: # 如果文件为空
84
+ if not content:
93
85
  return None
94
86
  data = json.loads(content)
95
- value = data.get(key)
96
- return value
87
+ return data.get(key)
97
88
  except FileNotFoundError:
98
89
  return None
99
- except json.JSONDecodeError as e:
100
- logger.error(f"JSON格式错误: {e}")
101
- # 如果JSON格式错误,重新创建一个空的配置文件
90
+ except json.JSONDecodeError:
102
91
  try:
103
92
  with open(filepath, "w", encoding="utf-8") as f:
104
93
  json.dump({}, f, indent=4, ensure_ascii=False)
105
- logger.info("已重新创建配置文件")
106
- except Exception as write_error:
107
- logger.error(f"重新创建配置文件失败: {write_error}")
94
+ except Exception:
95
+ pass
108
96
  return None
109
- except Exception as e:
110
- logger.exception(f"读取设置时出错: {e}")
97
+ except Exception:
111
98
  return None
112
99
 
113
100
  @staticmethod
114
- def setSetting(key, value,workspaceName = ""):
115
- """
116
- 将键值对存储到本地文件(线程安全版本)
117
- """
118
- logger.info(f"开始保存设置: {key} = {value}")
101
+ def setSetting(key, value, workspaceName=""):
119
102
  try:
120
- with configPresenter._lock: # 使用线程锁保护临界区
103
+ with configPresenter._lock:
121
104
  filepath = configPresenter.get_config_file_path(workspaceName)
122
105
  if not os.path.exists(filepath):
123
106
  with open(filepath, "w", encoding="utf-8") as f:
124
107
  json.dump({}, f, indent=4, ensure_ascii=False)
125
108
 
126
- # 读取现有数据
127
109
  try:
128
110
  with open(filepath, "r", encoding="utf-8") as f:
129
111
  data = json.load(f)
130
112
  except (json.JSONDecodeError, FileNotFoundError):
131
113
  data = {}
132
114
 
133
- # 更新数据
134
- old_value = data.get(key, "未设置")
135
115
  data[key] = value
136
116
 
137
- # 写回文件
138
117
  with open(filepath, "w", encoding="utf-8") as f:
139
118
  json.dump(data, f, indent=4, ensure_ascii=False)
140
119
  except Exception as e:
141
120
  logger.exception(f"保存设置时出错: {e}")
142
121
  return False
143
122
  return True
144
-
145
- @staticmethod
146
- def setCurrentModelInfo(workspaceName,modelId,providerId):
147
- configPresenter.setSetting("currentModel", modelId,workspaceName)
148
- configPresenter.setSetting("currentProvider", providerId,workspaceName)
149
-
150
- @staticmethod
151
- def getCurrentModelInfo(workspaceName):
152
- currentModel = configPresenter.getSetting("currentModel",workspaceName)
153
- currentProvider = configPresenter.getSetting("currentProvider",workspaceName)
154
- return {"modelId": currentModel, "providerId": currentProvider}
155
-
156
- @staticmethod
157
- def setProviderById(key,value):
158
- pass
159
-
160
- @staticmethod
161
- def deleteProviders(id):
162
- pass
163
123
 
164
124
  @staticmethod
165
- def addProviders(value):
166
- pass
167
-
168
- @staticmethod
169
- def get_fsss2_file_path():
170
- """获取fsss2文件的完整路径(用于存储token)"""
171
- configPresenter.ensure_config_dir()
172
- config_dir = configPresenter.get_config_dir()
173
- return os.path.join(config_dir, "fsss2")
125
+ def set_evol_token(token: str):
126
+ """由 auth_bridge 注入 evol_token"""
127
+ with configPresenter._evol_token_lock:
128
+ configPresenter._evol_token = token
174
129
 
175
130
  @staticmethod
176
131
  def get_token():
177
- """
178
- 获取token(优先从fsss2文件读取)
179
- 读取逻辑:
180
- 1. 先读取fsss2文件
181
- 2. 如果没读取到,再读取原来位置的token
182
- 3. 如果原位置有token,写入fsss2文件再返回
183
- """
184
- fsss2_path = configPresenter.get_fsss2_file_path()
132
+ """获取 token - 优先从 auth_bridge 注入的值获取"""
133
+ with configPresenter._evol_token_lock:
134
+ if configPresenter._evol_token:
135
+ return configPresenter._evol_token
185
136
 
186
- # 1. 先尝试从fsss2文件读取
137
+ # 回退到文件
138
+ fsss2_path = configPresenter.get_fsss2_file_path()
187
139
  try:
188
140
  with open(fsss2_path, "r", encoding="utf-8") as f:
189
141
  token = f.read().strip()
@@ -191,1091 +143,92 @@ class configPresenter:
191
143
  return token
192
144
  except FileNotFoundError:
193
145
  pass
194
- except Exception as e:
195
- logger.error(f"读取fsss2文件时出错: {e}")
196
-
197
- # 2. fsss2没读到,尝试从原位置读取
198
- old_token = configPresenter.getSetting("token")
199
- if old_token:
200
- # 3. 原位置有token,写入fsss2文件
201
- try:
202
- with open(fsss2_path, "w", encoding="utf-8") as f:
203
- f.write(old_token)
204
- logger.info("已将token从原位置迁移到fsss2文件")
205
- except Exception as e:
206
- logger.error(f"迁移token到fsss2文件时出错: {e}")
207
- return old_token
146
+ except Exception:
147
+ pass
208
148
 
209
- return None
149
+ return configPresenter.getSetting("token")
210
150
 
211
151
  @staticmethod
212
152
  def set_token(token: str):
213
- """
214
- 设置token(写入fsss2文件)
215
- 如果token为空或None,删除fsss2文件以清除token
216
- """
217
153
  fsss2_path = configPresenter.get_fsss2_file_path()
218
-
219
- # 如果token为空,删除文件以清除token
220
154
  if not token:
221
155
  try:
222
156
  if os.path.exists(fsss2_path):
223
157
  os.remove(fsss2_path)
224
- logger.info("token已清除(fsss2文件已删除)")
225
158
  return True
226
- except Exception as e:
227
- logger.exception(f"清除token时出错: {e}")
159
+ except Exception:
228
160
  return False
229
161
 
230
162
  try:
231
163
  with open(fsss2_path, "w", encoding="utf-8") as f:
232
164
  f.write(token)
233
- logger.info("token已保存到fsss2文件")
234
165
  return True
235
- except Exception as e:
236
- logger.exception(f"保存token到fsss2文件时出错: {e}")
237
- return False
238
-
239
- @staticmethod
240
- def set_account_info(username: str, password: str):
241
- account_info = {"username": username, "password": password}
242
- return configPresenter.setSetting("account_info", json.dumps(account_info))
243
-
244
- @staticmethod
245
- def get_account_info():
246
- try:
247
- user_info = configPresenter.getSetting("account_info")
248
- if user_info is None:
249
- return None
250
- return json.loads(user_info)
251
- except:
252
- return None
253
-
254
- @staticmethod
255
- def set_user_info(aid: str, password: str):
256
- user_info = {"aid": aid, "password": password}
257
- return configPresenter.setSetting("user_info", json.dumps(user_info))
258
-
259
- @staticmethod
260
- def get_user_info():
261
- try:
262
- user_info = configPresenter.getSetting("user_info")
263
- if user_info is None:
264
- return None
265
- return json.loads(user_info)
266
- except:
267
- return None
268
-
269
- @staticmethod
270
- def getSearchPreviewEnabled():
271
- return configPresenter.searchPreviewEnabled
272
-
273
- @staticmethod
274
- def getCustomSearchEngines():
275
- return 'baidu'
276
-
277
- @staticmethod
278
- def getProviders():
279
- return []
280
-
281
- @staticmethod
282
- def getDefaultProviders():
283
- return ""
284
-
285
- @staticmethod
286
- def getLanguage():
287
- return "zh-CN"
288
-
289
- @staticmethod
290
- def getModelDefaultConfig(modal):
291
- return "";
292
-
293
- @staticmethod
294
- def getArtifactsEffectEnabled():
295
- return False
296
-
297
- @staticmethod
298
- def setProviderById(key,value):
299
- pass
300
-
301
- @staticmethod
302
- def deleteProviders(id):
303
- pass
304
-
305
- @staticmethod
306
- def addProviders(value):
307
- pass
308
-
309
- @staticmethod
310
- def is_autostart_enabled():
311
- return False
312
-
313
- @staticmethod
314
- def disable_autostart():
315
- return False
316
-
317
- @staticmethod
318
- def enable_autostart():
319
- return False
320
-
321
- @staticmethod
322
- def get_statistics_cache(workspace_name: str):
323
- """
324
- 获取工作空间统计数据缓存
325
-
326
- Args:
327
- workspace_name (str): 工作空间名称
328
-
329
- Returns:
330
- dict: 缓存数据,包含timestamp和data字段,如果没有缓存则返回None
331
- """
332
- cache_key = f"statistics_cache_{workspace_name}"
333
- return configPresenter.getSetting(cache_key, workspace_name)
334
-
335
- @staticmethod
336
- def set_statistics_cache(workspace_name: str, statistics_data: dict):
337
- """
338
- 设置工作空间统计数据缓存
339
-
340
- Args:
341
- workspace_name (str): 工作空间名称
342
- statistics_data (dict): 统计数据
343
-
344
- Returns:
345
- bool: 是否设置成功
346
- """
347
- cache_key = f"statistics_cache_{workspace_name}"
348
- cache_data = {
349
- "timestamp": time.time(),
350
- "data": statistics_data
351
- }
352
- return configPresenter.setSetting(cache_key, cache_data, workspace_name)
353
-
354
- @staticmethod
355
- def is_statistics_cache_valid(workspace_name: str, cache_timeout: int = 300):
356
- """
357
- 检查统计数据缓存是否有效(默认5分钟过期)
358
-
359
- Args:
360
- workspace_name (str): 工作空间名称
361
- cache_timeout (int): 缓存超时时间(秒),默认300秒(5分钟)
362
-
363
- Returns:
364
- bool: 缓存是否有效
365
- """
366
- cache_data = configPresenter.get_statistics_cache(workspace_name)
367
- if not cache_data or not isinstance(cache_data, dict):
368
- return False
369
-
370
- timestamp = cache_data.get("timestamp")
371
- if not timestamp:
372
- return False
373
-
374
- current_time = time.time()
375
- return (current_time - timestamp) < cache_timeout
376
-
377
- @staticmethod
378
- def get_default_download_path():
379
- """
380
- 获取系统默认下载路径
381
-
382
- Returns:
383
- str: 默认下载路径
384
- """
385
- import platform
386
-
387
- if platform.system() == "Windows":
388
- # Windows系统下载路径
389
- downloads_path = os.path.join(os.path.expanduser("~"), "Downloads")
390
- elif platform.system() == "Darwin": # macOS
391
- downloads_path = os.path.join(os.path.expanduser("~"), "Downloads")
392
- else: # Linux
393
- downloads_path = os.path.join(os.path.expanduser("~"), "Downloads")
394
-
395
- # 确保路径存在
396
- if not os.path.exists(downloads_path):
397
- try:
398
- os.makedirs(downloads_path, exist_ok=True)
399
- except Exception as e:
400
- logger.error(f"创建下载目录失败: {e}")
401
- # 降级到用户主目录
402
- downloads_path = os.path.expanduser("~")
403
-
404
- return downloads_path
405
-
406
- @staticmethod
407
- def get_download_path():
408
- """
409
- 获取下载路径设置,如果没有设置则返回系统默认下载路径
410
-
411
- Returns:
412
- str: 下载路径
413
- """
414
- download_path = configPresenter.getSetting("download_path")
415
- if not download_path:
416
- # 如果没有设置,获取系统默认下载路径并保存
417
- default_path = configPresenter.get_default_download_path()
418
- configPresenter.set_download_path(default_path)
419
- return default_path
420
- return download_path
421
-
422
- @staticmethod
423
- def set_download_path(path: str):
424
- """
425
- 设置下载路径
426
-
427
- Args:
428
- path (str): 下载路径
429
-
430
- Returns:
431
- bool: 是否设置成功
432
- """
433
- return configPresenter.setSetting("download_path", path)
434
-
435
- # ============ 默认工作空间路径配置 ============
436
-
437
- @staticmethod
438
- def get_default_workspace_path():
439
- """
440
- 获取默认工作空间路径
441
-
442
- Returns:
443
- str: 默认工作空间路径,如果未设置则返回None
444
- """
445
- return configPresenter.getSetting("default_workspace_path")
446
-
447
- @staticmethod
448
- def get_default_workspace_base_path():
449
- """
450
- 获取默认工作空间基础路径(系统默认路径)
451
-
452
- Returns:
453
- str: 默认工作空间基础路径
454
- """
455
- return os.path.join(configPresenter.get_config_dir(), "workspace")
456
-
457
- @staticmethod
458
- def set_default_workspace_path(path: str):
459
- """
460
- 设置默认工作空间路径
461
-
462
- Args:
463
- path (str): 默认工作空间路径
464
-
465
- Returns:
466
- bool: 是否设置成功
467
- """
468
- return configPresenter.setSetting("default_workspace_path", path)
469
-
470
- # ============ AI 网关配置管理 ============
471
-
472
- KEY_AI_GATEWAY_TYPE = "ai_gateway_type"
473
- KEY_AI_GATEWAY_CONFIGS = "ai_gateway_configs"
474
-
475
- # 默认网关配置
476
- DEFAULT_GATEWAY_CONFIGS = {
477
- "local": {
478
- "type": "local",
479
- "name": "本地网关",
480
- "description": "使用本地 ModelGate 服务",
481
- "baseUrl": "http://127.0.0.1:13148",
482
- "apiVersion": "/v1",
483
- "timeout": 30000,
484
- "retryCount": 3,
485
- "enabled": True
486
- },
487
- "cloud": {
488
- "type": "cloud",
489
- "name": "Evol 网关",
490
- "description": "使用 Evol 云端服务",
491
- # 兜底配置,实际云端地址会由 userPresenter 的网关信息覆盖
492
- "baseUrl": "https://mg-new.evolai.cn",
493
- "apiVersion": "/v1",
494
- "timeout": 30000,
495
- "retryCount": 3,
496
- "enabled": True
497
- }
498
- }
499
-
500
- @staticmethod
501
- def get_gateway_type():
502
- """
503
- 获取当前网关类型
504
-
505
- Returns:
506
- str: 'local' 或 'cloud',默认 'cloud'
507
- """
508
- gateway_type = configPresenter.getSetting(configPresenter.KEY_AI_GATEWAY_TYPE)
509
- if not gateway_type:
510
- # 默认使用云端网关
511
- configPresenter.set_gateway_type("cloud")
512
- return "cloud"
513
- return gateway_type
514
-
515
- @staticmethod
516
- def set_gateway_type(gateway_type: str):
517
- """
518
- 设置当前网关类型
519
-
520
- Args:
521
- gateway_type (str): 'local', 'cloud', 或 'custom-{id}'
522
-
523
- Returns:
524
- bool: 是否设置成功
525
- """
526
- # 验证网关类型
527
- if gateway_type in ["local", "cloud"]:
528
- # 预设网关,直接设置
529
- logger.info(f"Setting gateway type to: {gateway_type}")
530
- return configPresenter.setSetting(configPresenter.KEY_AI_GATEWAY_TYPE, gateway_type)
531
- elif gateway_type.startswith("custom-"):
532
- # 自定义网关,验证是否存在
533
- gateway_id = gateway_type.replace("custom-", "")
534
- custom_gateway = configPresenter.get_custom_gateway(gateway_id)
535
- if custom_gateway:
536
- logger.info(f"Setting gateway type to custom: {gateway_id}")
537
- return configPresenter.setSetting(configPresenter.KEY_AI_GATEWAY_TYPE, gateway_type)
538
- else:
539
- logger.error(f"Custom gateway not found: {gateway_id}")
540
- return False
541
- else:
542
- logger.error(f"Invalid gateway type: {gateway_type}")
543
- return False
544
-
545
- @staticmethod
546
- def get_gateway_configs():
547
- """
548
- 获取所有网关配置
549
-
550
- Returns:
551
- dict: 所有网关配置
552
- """
553
- #configs = configPresenter.getSetting(configPresenter.KEY_AI_GATEWAY_CONFIGS)
554
- #if not configs:
555
- # 首次使用,保存默认配置
556
- configPresenter.set_gateway_configs(configPresenter.DEFAULT_GATEWAY_CONFIGS)
557
- return configPresenter.DEFAULT_GATEWAY_CONFIGS
558
- #return configs
559
-
560
- @staticmethod
561
- def _apply_cloud_gateway_info(config: dict) -> dict:
562
- if not isinstance(config, dict):
563
- return config
564
-
565
- try:
566
- from .userPresenter import userPresenter
567
-
568
- result = userPresenter.get_cloud_gateway_info()
569
- gateway_info = None
570
- if isinstance(result, dict):
571
- gateway_info = result.get("gateway_info")
572
-
573
- if isinstance(gateway_info, dict):
574
- base_url = gateway_info.get("modelBaseUrl") or gateway_info.get("apiUrl")
575
- if base_url:
576
- updated = dict(config)
577
- updated["baseUrl"] = base_url
578
- return updated
579
166
  except Exception:
580
- return config
581
-
582
- return config
583
-
584
- @staticmethod
585
- def set_gateway_configs(configs: dict):
586
- """
587
- 设置所有网关配置
588
-
589
- Args:
590
- configs (dict): 网关配置字典
591
-
592
- Returns:
593
- bool: 是否设置成功
594
- """
595
- return configPresenter.setSetting(configPresenter.KEY_AI_GATEWAY_CONFIGS, configs)
596
-
597
- @staticmethod
598
- def get_gateway_config(gateway_type: str = None):
599
- """
600
- 获取指定网关的配置(支持自定义网关)
601
-
602
- Args:
603
- gateway_type (str): 网关类型,不传则使用当前网关
604
-
605
- Returns:
606
- dict: 网关配置
607
- """
608
- if not gateway_type:
609
- gateway_type = configPresenter.get_gateway_type()
610
-
611
- # 检查是否为自定义网关
612
- if gateway_type and gateway_type.startswith("custom-"):
613
- gateway_id = gateway_type.replace("custom-", "")
614
- custom_config = configPresenter.get_custom_gateway(gateway_id)
615
- if custom_config:
616
- logger.debug(f"Using custom gateway config: {gateway_id}")
617
- return custom_config
618
- else:
619
- logger.warning(f"Custom gateway not found: {gateway_id}, using default cloud gateway")
620
- return configPresenter.DEFAULT_GATEWAY_CONFIGS.get("cloud", {})
621
-
622
- # 原有逻辑:本地或云端网关
623
- configs = configPresenter.get_gateway_configs()
624
- config = configs.get(gateway_type)
625
-
626
- if not config:
627
- logger.warning(f"Gateway config not found: {gateway_type}, using default")
628
- return configPresenter.DEFAULT_GATEWAY_CONFIGS.get(gateway_type, {})
629
-
630
- if gateway_type == "cloud":
631
- return configPresenter._apply_cloud_gateway_info(config)
632
-
633
- return config
634
-
635
- @staticmethod
636
- def get_current_gateway_base_url():
637
- """
638
- 获取当前网关的 Base URL
639
-
640
- Returns:
641
- str: 当前网关的基础 URL
642
- """
643
- config = configPresenter.get_gateway_config()
644
- return config.get("baseUrl", "http://127.0.0.1:13148")
645
-
646
- @staticmethod
647
- def get_current_gateway_api_url():
648
- """
649
- 获取当前网关的 API URL(含版本)
650
-
651
- Returns:
652
- str: 当前网关的 API URL
653
- """
654
- config = configPresenter.get_gateway_config()
655
- base_url = config.get("baseUrl", "http://127.0.0.1:13148")
656
- api_version = config.get("apiVersion", "/v1")
657
- return f"{base_url}{api_version}"
658
-
659
- @staticmethod
660
- def get_current_gateway_api_key():
661
- """
662
- 获取当前网关的 API Key
663
-
664
- Returns:
665
- str: 当前网关的 API Key,如果没有则返回空字符串
666
- """
667
- config = configPresenter.get_gateway_config()
668
- return config.get("apiKey", "")
669
-
670
- @staticmethod
671
- def build_gateway_url(endpoint: str, include_version: bool = True, gateway_type: str = None):
672
- """
673
- 构建完整的网关端点 URL
674
-
675
- Args:
676
- endpoint (str): 端点路径
677
- include_version (bool): 是否包含版本号
678
- gateway_type (str): 网关类型,不传则使用当前网关
679
-
680
- Returns:
681
- str: 完整的 URL
682
- """
683
- config = configPresenter.get_gateway_config(gateway_type)
684
- base_url = config.get("baseUrl", "http://127.0.0.1:13148")
685
-
686
- if include_version:
687
- api_version = config.get("apiVersion", "/v1")
688
- base = f"{base_url}{api_version}"
689
- else:
690
- base = base_url
691
-
692
- # 确保 endpoint 以 / 开头
693
- if not endpoint.startswith("/"):
694
- endpoint = f"/{endpoint}"
695
-
696
- return f"{base}{endpoint}"
697
-
698
- # ============ 自定义网关管理 ============
699
-
700
- KEY_CUSTOM_GATEWAYS = "custom_gateways"
701
-
702
- @staticmethod
703
- def get_custom_gateways():
704
- """
705
- 获取所有自定义网关配置
706
-
707
- Returns:
708
- dict: 自定义网关配置字典,格式为 {gateway_id: config}
709
- """
710
- gateways = configPresenter.getSetting(configPresenter.KEY_CUSTOM_GATEWAYS)
711
- return gateways if gateways else {}
712
-
713
- @staticmethod
714
- def add_custom_gateway(config=None):
715
- """
716
- 添加自定义网关
717
-
718
- Args:
719
- config (dict): 网关配置,包含 name, baseUrl, apiKey, apiType 等字段
720
-
721
- Returns:
722
- dict: {"success": bool, "id": str} 添加结果
723
- """
724
- import uuid
725
-
726
- try:
727
- logger.info(f"add_custom_gateway called with config: {config}")
728
- logger.info(f"config type: {type(config)}")
729
-
730
- if config is None:
731
- logger.error("Config is None!")
732
- return {"success": False, "id": "", "error": "Config is None"}
733
-
734
- if not isinstance(config, dict):
735
- logger.error(f"Config is not a dict, it's {type(config)}")
736
- return {"success": False, "id": "", "error": f"Config must be dict, got {type(config)}"}
737
-
738
- # 生成唯一ID
739
- gateway_id = str(uuid.uuid4())[:8]
740
-
741
- gateways = configPresenter.get_custom_gateways()
742
-
743
- # 根据API类型确定API版本
744
- api_type = config.get("apiType", "openai")
745
- api_version = "/v1" # OpenAI风格默认使用 /v1
746
-
747
- # 构建完整的网关配置
748
- gateways[gateway_id] = {
749
- "id": gateway_id,
750
- "type": f"custom-{gateway_id}",
751
- "name": config.get("name", "自定义网关"),
752
- "description": config.get("description", f"自定义网关 - {config.get('baseUrl', '')}"),
753
- "baseUrl": config.get("baseUrl", ""),
754
- "apiKey": config.get("apiKey", ""),
755
- "apiType": api_type,
756
- "apiVersion": api_version, # 根据API类型自动设置
757
- "timeout": config.get("timeout", 30000),
758
- "retryCount": config.get("retryCount", 3),
759
- "enabled": True,
760
- "isCustom": True,
761
- "createdAt": time.strftime("%Y-%m-%dT%H:%M:%SZ")
762
- }
763
-
764
- success = configPresenter.setSetting(configPresenter.KEY_CUSTOM_GATEWAYS, gateways)
765
-
766
- if success:
767
- logger.info(f"Added custom gateway: {gateway_id} - {config.get('name')} (API Type: {api_type})")
768
- else:
769
- logger.error(f"Failed to add custom gateway: {config.get('name')}")
770
-
771
- return {"success": success, "id": gateway_id}
772
- except Exception as e:
773
- logger.exception(f"Exception in add_custom_gateway: {e}")
774
- return {"success": False, "id": "", "error": str(e)}
775
-
776
- @staticmethod
777
- def update_custom_gateway(gateway_id: str, config: dict):
778
- """
779
- 更新自定义网关配置
780
-
781
- Args:
782
- gateway_id (str): 网关ID
783
- config (dict): 要更新的配置字段
784
-
785
- Returns:
786
- bool: 是否更新成功
787
- """
788
- gateways = configPresenter.get_custom_gateways()
789
-
790
- if gateway_id not in gateways:
791
- logger.error(f"Custom gateway not found: {gateway_id}")
792
- return False
793
-
794
- # 保留原有的ID、类型和创建时间
795
- original = gateways[gateway_id]
796
-
797
- # 如果更新了apiType,需要更新对应的apiVersion
798
- if "apiType" in config:
799
- api_type = config.get("apiType", "openai")
800
- config["apiVersion"] = "/v1" # OpenAI风格使用 /v1
801
-
802
- # 更新配置(合并新旧配置)
803
- updated_config = {
804
- **original,
805
- **config,
806
- "id": gateway_id, # 确保ID不变
807
- "type": f"custom-{gateway_id}", # 确保type不变
808
- "createdAt": original.get("createdAt"), # 确保创建时间不变
809
- "isCustom": True # 确保isCustom标记不变
810
- }
811
-
812
- gateways[gateway_id] = updated_config
813
-
814
- success = configPresenter.setSetting(configPresenter.KEY_CUSTOM_GATEWAYS, gateways)
815
-
816
- if success:
817
- logger.info(f"Updated custom gateway: {gateway_id} (API Type: {updated_config.get('apiType', 'openai')})")
818
- else:
819
- logger.error(f"Failed to update custom gateway: {gateway_id}")
820
-
821
- return success
822
-
823
- @staticmethod
824
- def delete_custom_gateway(gateway_id: str):
825
- """
826
- 删除自定义网关
827
-
828
- Args:
829
- gateway_id (str): 网关ID
830
-
831
- Returns:
832
- bool: 是否删除成功
833
- """
834
- gateways = configPresenter.get_custom_gateways()
835
-
836
- if gateway_id not in gateways:
837
- logger.warning(f"Custom gateway not found for deletion: {gateway_id}")
838
- return False
839
-
840
- # 检查是否正在使用该网关
841
- current_gateway_type = configPresenter.get_gateway_type()
842
- if current_gateway_type == f"custom-{gateway_id}":
843
- logger.warning(f"Cannot delete custom gateway {gateway_id}: currently in use")
844
- # 自动切换到云端网关
845
- configPresenter.set_gateway_type("cloud")
846
- logger.info("Switched to cloud gateway")
847
-
848
- del gateways[gateway_id]
849
-
850
- success = configPresenter.setSetting(configPresenter.KEY_CUSTOM_GATEWAYS, gateways)
851
-
852
- if success:
853
- logger.info(f"Deleted custom gateway: {gateway_id}")
854
- else:
855
- logger.error(f"Failed to delete custom gateway: {gateway_id}")
856
-
857
- return success
858
-
859
- @staticmethod
860
- def get_custom_gateway(gateway_id: str):
861
- """
862
- 获取指定的自定义网关配置
863
-
864
- Args:
865
- gateway_id (str): 网关ID
866
-
867
- Returns:
868
- dict: 网关配置,如果不存在则返回None
869
- """
870
- gateways = configPresenter.get_custom_gateways()
871
- return gateways.get(gateway_id)
872
-
873
- # ============ 应用设置配置管理 ============
874
-
875
- KEY_APP_SETTINGS_HTTP_RULE = "app_settings_http_rule"
876
-
877
- @staticmethod
878
- def get_app_settings_http_rule():
879
- """
880
- 获取应用设置 - 允许局域网访问配置
881
-
882
- Returns:
883
- bool: True 允许局域网访问, False 不允许(默认)
884
- """
885
- result = configPresenter.getSetting(configPresenter.KEY_APP_SETTINGS_HTTP_RULE)
886
- if result is None:
887
167
  return False
888
- # 处理字符串类型的返回值
889
- if isinstance(result, str):
890
- return result.lower() == 'true'
891
- return bool(result)
892
168
 
893
169
  @staticmethod
894
- def set_app_settings_http_rule(enabled: bool):
895
- """
896
- 设置应用设置 - 允许局域网访问配置
897
-
898
- Args:
899
- enabled (bool): True 允许局域网访问, False 不允许
900
-
901
- Returns:
902
- bool: 是否设置成功
903
- """
904
- return configPresenter.setSetting(configPresenter.KEY_APP_SETTINGS_HTTP_RULE, enabled)
905
-
906
- # ============ 网络代理配置管理 ============
170
+ def get_fsss2_file_path():
171
+ configPresenter.ensure_config_dir()
172
+ config_dir = configPresenter.get_config_dir()
173
+ return os.path.join(config_dir, "fsss2")
907
174
 
908
- # 类变量:内存缓存
909
- _proxy_cache = None # None 表示未加载,True/False 表示配置值
175
+ # 代理相关配置
176
+ _proxy_cache = None
910
177
  KEY_USE_SYSTEM_PROXY = "use_system_proxy"
911
178
 
912
179
  @staticmethod
913
180
  def get_use_system_proxy():
914
- """
915
- 获取是否使用系统代理配置(优先从内存缓存读取)
916
-
917
- Returns:
918
- bool: True 表示使用系统代理, False 表示不使用(默认)
919
- """
920
- # 优先从缓存读取
921
181
  if configPresenter._proxy_cache is not None:
922
182
  return configPresenter._proxy_cache
923
-
924
- # 从硬盘加载
925
183
  result = configPresenter.getSetting(configPresenter.KEY_USE_SYSTEM_PROXY)
926
184
  if result is None:
927
- value = False # 默认不使用代理
185
+ value = False
928
186
  elif isinstance(result, str):
929
187
  value = result.lower() == 'true'
930
188
  else:
931
189
  value = bool(result)
932
-
933
- # 更新缓存
934
190
  configPresenter._proxy_cache = value
935
191
  return value
936
192
 
937
193
  @staticmethod
938
194
  def set_use_system_proxy(use_proxy: bool):
939
- """
940
- 设置是否使用系统代理配置(先更新内存,再写硬盘)
941
-
942
- Args:
943
- use_proxy (bool): True 表示使用系统代理, False 表示不使用
944
-
945
- Returns:
946
- bool: 是否设置成功
947
- """
948
- # 1. 先更新内存缓存
949
195
  configPresenter._proxy_cache = use_proxy
950
-
951
- # 2. 再写硬盘
952
196
  return configPresenter.setSetting(configPresenter.KEY_USE_SYSTEM_PROXY, use_proxy)
953
197
 
198
+ # 兼容性存根
954
199
  @staticmethod
955
- def load_proxy_config():
956
- """
957
- 启动时加载代理配置到内存(可选调用,懒加载也可以)
958
-
959
- Returns:
960
- bool: 当前的代理配置值
961
- """
962
- return configPresenter.get_use_system_proxy()
963
-
964
- # ============ Tab-MCP 绑定配置管理 ============
965
-
966
- KEY_TAB_MCP_BINDINGS = "tab_mcp_bindings"
967
-
968
- # 默认Tab-MCP绑定配置(硬编码回退值)
969
- # V1格式:字符串表示单个MCP名称
970
- # 后续V2格式:对象可支持多MCP或SubAgent
971
- DEFAULT_TAB_MCP_BINDINGS = {
972
- "files": "Evol记忆",
973
- "web": "Evol浏览器自动化",
974
- "pdf": "PDF助手",
975
- "excel": "Evol记忆",
976
- "word": "Evol记忆",
977
- "terminal": "Evol终端控制器",
978
- }
200
+ def getSearchPreviewEnabled():
201
+ return False
979
202
 
980
203
  @staticmethod
981
- def get_tab_mcp_bindings():
982
- """
983
- 获取Tab-MCP绑定配置
984
-
985
- Returns:
986
- dict: Tab类型到MCP服务名称的映射,格式为 {tabType: mcpServerName}
987
- """
988
- bindings = configPresenter.getSetting(configPresenter.KEY_TAB_MCP_BINDINGS)
989
- if not bindings or not isinstance(bindings, dict):
990
- # 返回默认配置
991
- return dict(configPresenter.DEFAULT_TAB_MCP_BINDINGS)
992
- # 合并默认值,确保新增的tabType有默认配置
993
- return {**configPresenter.DEFAULT_TAB_MCP_BINDINGS, **bindings}
204
+ def getCustomSearchEngines():
205
+ return 'baidu'
994
206
 
995
207
  @staticmethod
996
- def set_tab_mcp_bindings(bindings: dict):
997
- """
998
- 设置Tab-MCP绑定配置
999
-
1000
- Args:
1001
- bindings (dict): Tab类型到MCP服务名称的映射
1002
-
1003
- Returns:
1004
- bool: 是否设置成功
1005
- """
1006
- return configPresenter.setSetting(configPresenter.KEY_TAB_MCP_BINDINGS, bindings)
208
+ def getProviders():
209
+ return []
1007
210
 
1008
211
  @staticmethod
1009
- def get_mcp_for_tab_type(tab_type: str):
1010
- """
1011
- 获取指定Tab类型的默认MCP服务名称
1012
-
1013
- Args:
1014
- tab_type (str): Tab类型
1015
-
1016
- Returns:
1017
- str: MCP服务名称,如果未配置返回空字符串
1018
- """
1019
- bindings = configPresenter.get_tab_mcp_bindings()
1020
- return bindings.get(tab_type, "")
212
+ def getDefaultProviders():
213
+ return ""
1021
214
 
1022
215
  @staticmethod
1023
- def set_mcp_for_tab_type(tab_type: str, mcp_server_name: str):
1024
- """
1025
- 设置指定Tab类型的MCP服务
1026
-
1027
- Args:
1028
- tab_type (str): Tab类型
1029
- mcp_server_name (str): MCP服务名称,空字符串表示重置为默认值
1030
-
1031
- Returns:
1032
- bool: 是否设置成功
1033
- """
1034
- bindings = configPresenter.get_tab_mcp_bindings()
1035
-
1036
- if mcp_server_name == '':
1037
- # 空字符串表示重置:删除该key,让默认值生效
1038
- bindings.pop(tab_type, None)
1039
- else:
1040
- # 设置用户自定义的MCP服务
1041
- bindings[tab_type] = mcp_server_name
1042
-
1043
- return configPresenter.set_tab_mcp_bindings(bindings)
216
+ def getLanguage():
217
+ return "zh-CN"
1044
218
 
1045
- # ============ 远程访问控制配置管理 ============
219
+ @staticmethod
220
+ def getModelDefaultConfig(modal):
221
+ return ""
1046
222
 
1047
- KEY_REMOTE_ACCESS_ENABLED = "remote_access_enabled"
1048
- KEY_DISABLED_PAIRING_CODES = "disabled_pairing_codes"
223
+ @staticmethod
224
+ def getArtifactsEffectEnabled():
225
+ return False
1049
226
 
1050
227
  @staticmethod
1051
228
  def get_remote_access_enabled():
1052
- """
1053
- 获取远程访问总开关状态
1054
-
1055
- Returns:
1056
- bool: True 允许远程访问, False 禁止远程访问(默认)
1057
- """
1058
- result = configPresenter.getSetting(configPresenter.KEY_REMOTE_ACCESS_ENABLED)
229
+ result = configPresenter.getSetting("remote_access_enabled")
1059
230
  if result is None:
1060
- return False
231
+ return True # Proxy 模块默认允许访问
1061
232
  if isinstance(result, str):
1062
233
  return result.lower() == 'true'
1063
234
  return bool(result)
1064
-
1065
- @staticmethod
1066
- def set_remote_access_enabled(enabled: bool):
1067
- """
1068
- 设置远程访问总开关
1069
-
1070
- Args:
1071
- enabled (bool): True 允许远程访问, False 禁止远程访问
1072
-
1073
- Returns:
1074
- bool: 是否设置成功
1075
- """
1076
- return configPresenter.setSetting(configPresenter.KEY_REMOTE_ACCESS_ENABLED, enabled)
1077
-
1078
- @staticmethod
1079
- def get_disabled_pairing_codes():
1080
- """
1081
- 获取禁用的配对码列表
1082
-
1083
- Returns:
1084
- list: 禁用的配对码列表
1085
- """
1086
- result = configPresenter.getSetting(configPresenter.KEY_DISABLED_PAIRING_CODES)
1087
- if result is None:
1088
- return []
1089
- if isinstance(result, str):
1090
- # 支持逗号分隔的字符串格式
1091
- if not result.strip():
1092
- return []
1093
- return [code.strip() for code in result.split(',') if code.strip()]
1094
- if isinstance(result, list):
1095
- return result
1096
- return []
1097
-
1098
- @staticmethod
1099
- def set_disabled_pairing_codes(codes: list):
1100
- """
1101
- 设置禁用的配对码列表
1102
-
1103
- Args:
1104
- codes (list): 禁用的配对码列表
1105
-
1106
- Returns:
1107
- bool: 是否设置成功
1108
- """
1109
- return configPresenter.setSetting(configPresenter.KEY_DISABLED_PAIRING_CODES, codes)
1110
-
1111
- @staticmethod
1112
- def add_disabled_pairing_code(code: str):
1113
- """
1114
- 添加一个禁用的配对码
1115
-
1116
- Args:
1117
- code (str): 要禁用的配对码
1118
-
1119
- Returns:
1120
- bool: 是否添加成功
1121
- """
1122
- if not code or not code.strip():
1123
- return False
1124
- codes = configPresenter.get_disabled_pairing_codes()
1125
- code = code.strip()
1126
- if code not in codes:
1127
- codes.append(code)
1128
- return configPresenter.set_disabled_pairing_codes(codes)
1129
- return True
1130
-
1131
- @staticmethod
1132
- def remove_disabled_pairing_code(code: str):
1133
- """
1134
- 移除一个禁用的配对码
1135
-
1136
- Args:
1137
- code (str): 要移除的配对码
1138
-
1139
- Returns:
1140
- bool: 是否移除成功
1141
- """
1142
- if not code or not code.strip():
1143
- return False
1144
- codes = configPresenter.get_disabled_pairing_codes()
1145
- code = code.strip()
1146
- if code in codes:
1147
- codes.remove(code)
1148
- return configPresenter.set_disabled_pairing_codes(codes)
1149
- return True
1150
-
1151
- @staticmethod
1152
- def is_pairing_code_disabled(code: str):
1153
- """
1154
- 检查配对码是否被禁用
1155
-
1156
- Args:
1157
- code (str): 配对码
1158
-
1159
- Returns:
1160
- bool: True 表示被禁用, False 表示未被禁用
1161
- """
1162
- if not code or not code.strip():
1163
- return False
1164
- codes = configPresenter.get_disabled_pairing_codes()
1165
- return code.strip() in codes
1166
-
1167
- @staticmethod
1168
- def get_remote_access_config():
1169
- """
1170
- 获取远程访问配置(总开关 + 禁用的配对码)
1171
-
1172
- Returns:
1173
- dict: {
1174
- "enabled": bool,
1175
- "disabled_codes": list
1176
- }
1177
- """
1178
- return {
1179
- "enabled": configPresenter.get_remote_access_enabled(),
1180
- "disabled_codes": configPresenter.get_disabled_pairing_codes()
1181
- }
1182
-
1183
- @staticmethod
1184
- def set_remote_access_config(enabled: bool = None, disabled_codes: list = None):
1185
- """
1186
- 设置远程访问配置
1187
-
1188
- Args:
1189
- enabled (bool): 总开关状态(可选)
1190
- disabled_codes (list): 禁用的配对码列表(可选)
1191
-
1192
- Returns:
1193
- dict: {"success": bool, "message": str}
1194
- """
1195
- try:
1196
- if enabled is not None:
1197
- configPresenter.set_remote_access_enabled(enabled)
1198
- if disabled_codes is not None:
1199
- configPresenter.set_disabled_pairing_codes(disabled_codes)
1200
- return {"success": True, "message": "配置已更新"}
1201
- except Exception as e:
1202
- return {"success": False, "message": str(e)}
1203
-
1204
- # ============ 用户默认系统提示词配置管理 ============
1205
-
1206
- KEY_USER_DEFAULT_SYSTEM_PROMPT = "user_default_system_prompt"
1207
-
1208
- @staticmethod
1209
- def get_user_default_system_prompt(workspace_name: str):
1210
- """
1211
- 获取用户默认系统提示词(workspace级别)
1212
-
1213
- Args:
1214
- workspace_name (str): 任务空间名称
1215
-
1216
- Returns:
1217
- dict: 提示词数据字典 {'userCustom': str, 'version': str},如果未设置返回默认值
1218
- """
1219
- try:
1220
- prompt_data = configPresenter.getSetting(
1221
- configPresenter.KEY_USER_DEFAULT_SYSTEM_PROMPT,
1222
- workspace_name
1223
- )
1224
-
1225
- if not prompt_data:
1226
- # 返回默认值
1227
- return {'userCustom': '', 'version': '1.0'}
1228
-
1229
- # 兼容旧格式(字符串)
1230
- if isinstance(prompt_data, str):
1231
- try:
1232
- return json.loads(prompt_data)
1233
- except json.JSONDecodeError:
1234
- # 如果不是JSON,当作纯文本处理
1235
- return {'userCustom': prompt_data, 'version': '1.0'}
1236
-
1237
- # 新格式(字典)
1238
- return prompt_data
1239
- except Exception as e:
1240
- logger.exception(f"获取用户默认系统提示词失败: {e}")
1241
- return {'userCustom': '', 'version': '1.0'}
1242
-
1243
- @staticmethod
1244
- def set_user_default_system_prompt(workspace_name: str, prompt_data: dict):
1245
- """
1246
- 设置用户默认系统提示词(workspace级别)
1247
-
1248
- Args:
1249
- workspace_name (str): 任务空间名称
1250
- prompt_data (dict): 提示词数据 {'userCustom': str, 'version': str}
1251
-
1252
- Returns:
1253
- bool: 是否设置成功
1254
- """
1255
- try:
1256
- if not isinstance(prompt_data, dict):
1257
- logger.error(f"prompt_data必须是字典类型,当前类型: {type(prompt_data)}")
1258
- return False
1259
-
1260
- # 确保包含必要字段
1261
- if 'userCustom' not in prompt_data:
1262
- prompt_data['userCustom'] = ''
1263
- if 'version' not in prompt_data:
1264
- prompt_data['version'] = '1.0'
1265
-
1266
- success = configPresenter.setSetting(
1267
- configPresenter.KEY_USER_DEFAULT_SYSTEM_PROMPT,
1268
- prompt_data,
1269
- workspace_name
1270
- )
1271
-
1272
- if success:
1273
- logger.info(f"已保存用户默认系统提示词到workspace: {workspace_name}")
1274
- else:
1275
- logger.error(f"保存用户默认系统提示词失败: {workspace_name}")
1276
-
1277
- return success
1278
- except Exception as e:
1279
- logger.exception(f"设置用户默认系统提示词失败: {e}")
1280
- return False
1281
-