@agentunion/kite 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (573) hide show
  1. package/.claude/skills/kite/checklists/feature-checklist.md +496 -0
  2. package/.claude/skills/kite/references/event-patterns.md +180 -0
  3. package/.claude/skills/kite/references/health-check.md +202 -0
  4. package/.claude/skills/kite/references/http-service.md +199 -0
  5. package/.claude/skills/kite/references/module-md-spec.md +172 -0
  6. package/.claude/skills/kite/references/multi-connection.md +147 -0
  7. package/.claude/skills/kite/references/rpc-patterns.md +199 -0
  8. package/.claude/skills/kite/references/shutdown-sequence.md +146 -0
  9. package/.claude/skills/kite/references/stdin-protocol.md +147 -0
  10. package/.claude/skills/kite/references/test-center-integration.md +178 -0
  11. package/.claude/skills/kite/references/ws-lifecycle.md +301 -0
  12. package/.claude/skills/kite/skill.md +272 -0
  13. package/.claude/skills/kite/templates/go/README.md +20 -0
  14. package/.claude/skills/kite/templates/node/entry.js +134 -0
  15. package/.claude/skills/kite/templates/node/module.md +16 -0
  16. package/.claude/skills/kite/templates/node/server.js +351 -0
  17. package/.claude/skills/kite/templates/node/server_http.js +90 -0
  18. package/.claude/skills/kite/templates/python/entry.py +425 -0
  19. package/.claude/skills/kite/templates/python/module.md +26 -0
  20. package/.claude/skills/kite/templates/python/server.py +447 -0
  21. package/.claude/skills/kite/templates/python/server_http.py +433 -0
  22. package/cli.js +38 -4
  23. package/core/env_checker.py +96 -0
  24. package/docs/05-/347/237/255/344/277/241/350/256/244/350/257/201/344/270/216/347/224/250/346/210/267/344/277/241/346/201/257/346/216/245/345/217/243/346/226/207/346/241/243.md +507 -0
  25. package/docs/ACP/345/215/217/350/256/256/345/205/274/345/256/271/346/226/271/346/241/210.md +138 -0
  26. package/docs/CI/344/270/216AI/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/346/226/271/346/241/210.md +75 -0
  27. package/docs/CLI/345/274/200/345/217/221/350/256/241/345/210/222.md +595 -0
  28. package/docs/ClaudeCode/350/277/234/347/250/213/345/215/217/344/275/234/347/263/273/347/273/237-/346/212/200/346/234/257/350/257/204/344/274/260.md +535 -0
  29. package/docs/ClaudeCode/350/277/234/347/250/213/345/215/217/344/275/234/347/263/273/347/273/237/350/256/276/350/256/241.md +631 -0
  30. package/docs/Evol-App/344/275/277/347/224/250KernelClient/346/224/271/351/200/240/345/256/214/346/210/220.md +342 -0
  31. package/docs/Evol/346/216/247/345/210/266/345/217/260/346/217/222/344/273/266/345/214/226/346/236/266/346/236/204/346/246/202/350/246/201.md +604 -0
  32. package/docs/Evol/346/216/247/345/210/266/345/217/260/346/217/222/344/273/266/345/214/226/346/236/266/346/236/204/350/256/276/350/256/241.md +1708 -0
  33. package/docs/Evol/346/250/241/345/235/227/350/256/276/350/256/241/346/226/271/346/241/210.md +1154 -0
  34. package/docs/Evol/351/241/265/351/235/242/346/217/222/344/273/266/345/214/226-Evol/346/250/241/345/235/227/345/256/236/346/226/275/346/214/207/345/215/227.md +403 -0
  35. package/docs/Evol/351/241/265/351/235/242/346/217/222/344/273/266/345/214/226-/345/244/226/351/203/250/346/250/241/345/235/227/346/216/245/345/205/245/346/214/207/345/215/227.md +468 -0
  36. package/docs/HTTP-RPC/350/277/201/347/247/273/345/210/260WebSocket/350/256/241/345/210/222.md +318 -0
  37. package/docs/INDEX.md +388 -0
  38. package/docs/KITE_DOCS_GUIDE.md +33 -0
  39. package/docs/Kernel-Client-Kite-Token/346/224/257/346/214/201/345/256/236/346/226/275/345/256/214/346/210/220.md +330 -0
  40. package/docs/Kernel/344/270/273/345/212/250Ping/346/234/272/345/210/266-/346/255/243/347/241/256/345/256/236/347/216/260.md +235 -0
  41. package/docs/Kernel/344/270/273/345/212/250Ping/346/234/272/345/210/266/345/256/236/346/226/275/346/200/273/347/273/223.md +204 -0
  42. package/docs/Kite/345/256/211/350/243/205/351/227/256/351/242/230/350/247/243/345/206/263/346/226/271/346/241/210.md +362 -0
  43. package/docs/Kite/346/216/247/345/210/266/345/217/260/346/217/222/344/273/266/345/214/226/346/236/266/346/236/204/350/256/276/350/256/241-/347/273/210/346/236/201/347/233/256/346/240/207.md +721 -0
  44. package/docs/Kite/346/216/247/345/210/266/345/217/260/347/273/237/344/270/200WebSocket/346/224/271/351/200/240/346/226/271/346/241/210.md +821 -0
  45. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/01-/346/241/206/346/236/266/345/256/232/344/275/215.md +12 -0
  46. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/02-/346/240/270/345/277/203/346/246/202/345/277/265.md +341 -0
  47. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/03-/347/263/273/347/273/237/346/236/266/346/236/204.md +257 -0
  48. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/04-/346/250/241/345/235/227/350/247/204/350/214/203.md +263 -0
  49. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/05-/346/240/270/345/277/203/346/265/201/347/250/213-/346/226/260/347/211/210.md +267 -0
  50. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/05-/346/240/270/345/277/203/346/265/201/347/250/213.md +149 -0
  51. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/06-/347/233/256/345/275/225/347/273/223/346/236/204.md +231 -0
  52. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/07-/346/225/260/346/215/256/346/250/241/345/236/213.md +68 -0
  53. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/08-/346/211/251/345/261/225/346/200/247.md +34 -0
  54. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/09-/344/270/216/345/205/267/344/275/223/345/272/224/347/224/250/347/232/204/345/205/263/347/263/273.md +22 -0
  55. package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/README.md +46 -0
  56. package/docs/Kite/347/263/273/347/273/237/345/220/257/345/212/250/346/265/201/347/250/213.md +567 -0
  57. package/docs/Launcher/345/220/257/345/212/250/345/231/250/346/226/207/346/241/243.md +745 -0
  58. package/docs/Polyglot/350/277/220/350/241/214/346/227/266/344/270/216Clawdbot/345/205/274/345/256/271/346/200/247/350/256/276/350/256/241.md +321 -0
  59. package/docs/Redis/344/270/216/346/250/241/345/235/227/345/244/232/345/256/236/344/276/213/346/226/271/346/241/210.md +438 -0
  60. package/docs/Relay-Kite-Token/350/256/244/350/257/201/345/256/236/346/226/275/345/256/214/346/210/220.md +178 -0
  61. package/docs/Relay-Token/346/235/203/351/231/220/351/205/215/347/275/256/351/252/214/350/257/201.md +113 -0
  62. package/docs/Watchdog/345/201/245/345/272/267/346/243/200/346/237/245/344/270/216WebSocket-Ping/346/234/272/345/210/266/345/210/206/346/236/220.md +367 -0
  63. package/docs/Watchdog/350/265/204/346/272/220/347/233/221/346/216/247/347/255/226/347/225/245.md +92 -0
  64. package/docs/WebSocket/346/216/245/346/224/266/345/276/252/347/216/257/346/255/273/351/224/201/351/230/262/350/214/203/350/247/204/350/214/203.md +357 -0
  65. package/docs/WebSocket/350/277/236/346/216/245/351/237/247/346/200/247/344/270/216/351/207/215/350/277/236/346/234/272/345/210/266/345/256/214/346/225/264/346/226/271/346/241/210.md +531 -0
  66. package/docs/WebSocket/350/277/236/346/216/245/351/237/247/346/200/247/346/226/271/346/241/210.md +169 -0
  67. package/docs/WebSocket/351/207/215/350/277/236/346/234/272/345/210/266/346/265/213/350/257/225/346/212/245/345/221/212.md +169 -0
  68. package/docs/WebSocket/351/207/215/350/277/236/351/200/200/351/201/277/346/234/272/345/210/266/346/226/271/346/241/210.md +394 -0
  69. package/docs/Web/346/250/241/345/235/227/344/270/216Evol/346/250/241/345/235/227/351/207/215/346/236/204/345/210/206/346/236/220.md +521 -0
  70. package/docs/audit-api-guide.md +68 -0
  71. package/docs/audit-module-design.md +315 -0
  72. package/docs/audit-module-implementation-summary.md +149 -0
  73. package/docs/llm-context-design.md +52 -0
  74. package/docs/llm-test-enhancement-plan.md +970 -0
  75. package/docs/logs-api-guide.md +42 -0
  76. package/docs/npm/345/214/205Python/347/216/257/345/242/203/347/256/241/347/220/206/346/226/271/346/241/210.md +302 -0
  77. package/docs/npm/345/217/221/345/270/203/344/270/216CLI/344/275/277/347/224/250/346/214/207/345/215/227.md +245 -0
  78. package/docs/stdio/344/270/216/347/253/257/345/217/243/345/217/221/347/216/260/351/207/215/346/236/204.md +480 -0
  79. package/docs/web/346/250/241/345/235/227/344/270/255/350/275/254/346/234/215/345/212/241/350/256/276/350/256/241/346/226/271/346/241/210.md +449 -0
  80. package/docs//344/272/213/344/273/266/345/244/204/347/220/206/346/234/272/345/210/266.md +388 -0
  81. package/docs//344/272/213/344/273/266/345/244/204/347/220/206/350/247/204/350/214/203.md +113 -0
  82. package/docs//344/272/213/344/273/266/350/256/242/351/230/205/351/200/232/351/205/215/347/254/246/350/247/204/350/214/203.md +256 -0
  83. package/docs//344/272/213/344/273/266/351/230/237/345/210/227/345/274/271/346/200/247/347/256/241/347/220/206.md +449 -0
  84. package/docs//344/272/244/344/272/222/345/274/217/347/273/210/347/253/257/346/216/247/345/210/266/346/226/271/346/241/210.md +301 -0
  85. package/docs//344/273/243/347/220/206/345/220/257/345/212/250/345/231/250/344/270/216/345/256/271/345/231/250/345/214/226.md +140 -0
  86. package/docs//344/273/243/347/240/201/347/273/237/350/256/241/345/267/245/345/205/267/344/275/277/347/224/250/350/257/264/346/230/216.md +217 -0
  87. package/docs//344/274/230/351/233/205/351/200/200/345/207/272/350/247/204/350/214/203.md +362 -0
  88. package/docs//344/276/235/350/265/226/347/256/241/347/220/206/350/257/264/346/230/216.md +141 -0
  89. package/docs//344/277/256/345/244/215/346/235/203/351/231/220/351/227/256/351/242/230-evol-RPC/346/235/203/351/231/220.md +268 -0
  90. package/docs//345/210/240/351/231/244kernel-client-example/345/256/214/346/210/220.md +309 -0
  91. package/docs//345/210/240/351/231/244ws-management/345/256/214/346/210/220.md +418 -0
  92. package/docs//345/220/257/345/212/250/344/274/230/345/214/226/346/226/271/346/241/210.md +522 -0
  93. package/docs//345/220/257/345/212/250/344/276/235/350/265/226/344/270/216/346/216/222/345/272/217.md +105 -0
  94. package/docs//345/256/211/350/243/205/350/204/232/346/234/254/345/274/200/345/217/221/346/226/207/346/241/243.md +643 -0
  95. package/docs//345/256/214/346/225/264/345/220/257/345/212/250/346/265/201/347/250/213/350/256/276/350/256/241.md +452 -0
  96. package/docs//345/256/236/347/216/260/350/247/204/345/210/222.md +195 -0
  97. package/docs//345/277/203/350/267/263/346/234/272/345/210/266/351/207/215/346/236/204/346/200/273/347/273/223.md +166 -0
  98. package/docs//346/217/241/346/211/213/350/256/244/350/257/201/346/226/271/346/241/210-/345/256/211/345/205/250/345/256/241/346/237/245.md +176 -0
  99. package/docs//346/217/241/346/211/213/350/256/244/350/257/201/346/226/271/346/241/210.md +908 -0
  100. package/docs//346/226/207/346/241/243/346/233/264/346/226/260/346/270/205/345/215/225.md +83 -0
  101. package/docs//346/227/245/345/277/227/344/270/216/345/274/202/345/270/270/345/244/204/347/220/206/350/247/204/350/214/203.md +829 -0
  102. package/docs//346/227/245/345/277/227/350/260/203/350/257/225/345/256/236/346/210/230/346/214/207/345/215/227.md +25 -0
  103. package/docs//346/236/266/346/236/204/345/200/237/351/211/264/346/214/207/345/215/227.md +977 -0
  104. package/docs//346/236/266/346/236/204/346/224/271/351/200/240-/345/256/214/346/210/220/346/200/273/347/273/223.md +440 -0
  105. package/docs//346/236/266/346/236/204/347/216/260/347/212/266/344/270/216/347/273/210/346/236/201/347/233/256/346/240/207/345/257/271/346/257/224/345/210/206/346/236/220.md +508 -0
  106. package/docs//346/250/241/345/235/227/345/244/232/350/277/236/346/216/245/346/216/247/345/210/266/347/255/226/347/225/245.md +220 -0
  107. package/docs//346/250/241/345/235/227/345/256/211/350/243/205/346/234/272/345/210/266/350/256/276/350/256/241.md +500 -0
  108. package/docs//346/250/241/345/235/227/345/274/200/345/217/221/346/214/207/345/215/227.md +1824 -0
  109. package/docs//346/250/241/345/235/227/347/203/255/346/233/264/346/226/260.md +89 -0
  110. package/docs//346/250/241/345/235/227/350/277/234/347/250/213/351/203/250/347/275/262/345/274/200/345/217/221/350/247/204/350/214/203.md +460 -0
  111. package/docs//346/250/241/345/235/227/351/200/200/345/207/272/346/234/272/345/210/266/345/256/214/346/225/264/346/226/271/346/241/210.md +303 -0
  112. package/docs//346/250/241/345/235/227/351/205/215/347/275/256/345/212/240/350/275/275/344/270/216/347/203/255/351/207/215/350/275/275/350/247/204/350/214/203.md +369 -0
  113. package/docs//346/265/213/350/257/225/344/270/255/345/277/203/346/267/273/345/212/240/346/250/241/345/235/227/346/265/213/350/257/225/346/214/207/345/215/227.md +147 -0
  114. package/docs//347/211/210/346/234/254/351/224/201/345/256/232/347/216/257/345/242/203/347/256/241/347/220/206/346/226/271/346/241/210.md +331 -0
  115. package/docs//347/216/257/345/242/203/345/217/230/351/207/217/344/270/216/350/277/220/350/241/214/346/227/266/347/233/256/345/275/225/350/256/276/350/256/241.md +499 -0
  116. package/docs//347/216/257/345/242/203/347/256/241/347/220/206/345/256/214/346/225/264/346/226/271/346/241/210.md +334 -0
  117. package/docs//350/231/232/346/213/237/346/250/241/345/235/227/344/270/255/350/275/254/346/234/215/345/212/241/345/256/214/346/225/264/350/256/276/350/256/241.md +1496 -0
  118. package/docs//350/231/232/346/213/237/347/216/257/345/242/203/345/267/245/344/275/234/345/216/237/347/220/206.md +163 -0
  119. package/docs//350/256/241/345/210/222/347/256/241/347/220/206/345/231/250/344/275/277/347/224/250/346/214/207/345/215/227.md +196 -0
  120. package/docs//350/256/244/350/257/201/346/250/241/345/235/227/344/270/216Gateway/350/256/276/350/256/241/346/226/271/346/241/210.md +765 -0
  121. package/docs//350/277/234/347/250/213/346/250/241/345/235/227/350/256/276/350/256/241-/346/227/247/347/211/210.md +1117 -0
  122. package/docs//350/277/234/347/250/213/346/250/241/345/235/227/350/256/276/350/256/241.md +451 -0
  123. package/docs//351/207/215/346/236/204/346/234/272/345/210/266/346/270/205/345/215/225.md +192 -0
  124. package/docs//351/223/276/350/267/257/350/277/275/350/270/252/346/226/271/346/241/210.md +242 -0
  125. package/docs//351/231/215/347/272/247/347/255/226/347/225/245/350/256/276/350/256/241/346/226/271/346/241/210.md +618 -0
  126. package/extensions/agents/assistant/entry.py +113 -14
  127. package/extensions/agents/assistant/module.md +27 -22
  128. package/extensions/agents/assistant/server.py +291 -105
  129. package/extensions/channels/acp_channel/entry.py +114 -16
  130. package/extensions/channels/acp_channel/module.md +4 -0
  131. package/extensions/channels/acp_channel/server.py +396 -105
  132. package/extensions/channels/phone_channel/__init__.py +1 -0
  133. package/extensions/channels/phone_channel/entry.py +503 -0
  134. package/extensions/channels/phone_channel/module.md +31 -0
  135. package/extensions/channels/phone_channel/server.py +686 -0
  136. package/extensions/event_hub_bench/entry.py +55 -12
  137. package/extensions/event_hub_bench/module.md +27 -27
  138. package/extensions/services/audit/README.md +134 -0
  139. package/extensions/services/audit/collector.py +73 -0
  140. package/extensions/services/audit/entry.py +444 -0
  141. package/extensions/services/audit/module.md +66 -0
  142. package/extensions/services/audit/query_audit.py +111 -0
  143. package/extensions/services/audit/routes/__init__.py +1 -0
  144. package/extensions/services/audit/routes/routes_audit.py +113 -0
  145. package/extensions/services/audit/schemas/__init__.py +5 -0
  146. package/extensions/services/audit/schemas/audit_event.py +92 -0
  147. package/extensions/services/audit/server.py +542 -0
  148. package/extensions/services/audit/storage.py +95 -0
  149. package/extensions/services/auth/entry.py +1054 -0
  150. package/extensions/services/auth/module.md +31 -0
  151. package/extensions/services/auth/token_store.py +185 -0
  152. package/extensions/services/auth/verifiers/evol_account.py +101 -0
  153. package/extensions/services/auth/verifiers/kite_token.py +38 -0
  154. package/extensions/services/auth/verifiers/pairing_code.py +71 -0
  155. package/extensions/services/backup/entry.py +494 -197
  156. package/extensions/services/backup/module.md +4 -2
  157. package/extensions/services/dataclaw/api/__init__.py +0 -0
  158. package/extensions/services/dataclaw/api/admin.py +367 -0
  159. package/extensions/services/dataclaw/api/copyright.py +175 -0
  160. package/extensions/services/dataclaw/api/credits.py +177 -0
  161. package/extensions/services/dataclaw/api/data.py +179 -0
  162. package/extensions/services/dataclaw/api/demands.py +269 -0
  163. package/extensions/services/dataclaw/api/feeds.py +262 -0
  164. package/extensions/services/dataclaw/api/identity.py +505 -0
  165. package/extensions/services/dataclaw/api/notifications.py +104 -0
  166. package/extensions/services/dataclaw/api/reviews.py +138 -0
  167. package/extensions/services/dataclaw/api/search.py +153 -0
  168. package/extensions/services/dataclaw/api/subscriptions.py +157 -0
  169. package/extensions/services/dataclaw/config.json5 +96 -0
  170. package/extensions/services/dataclaw/core/__init__.py +0 -0
  171. package/extensions/services/dataclaw/core/auth.py +95 -0
  172. package/extensions/services/dataclaw/core/config.py +50 -0
  173. package/extensions/services/dataclaw/core/database.py +70 -0
  174. package/extensions/services/dataclaw/entry.py +416 -0
  175. package/extensions/services/dataclaw/gofeed/351/241/271/347/233/256/346/211/200/346/234/211/346/235/203/350/275/254/347/247/273/346/265/201/347/250/213/350/257/264/346/230/216.md +309 -0
  176. package/extensions/services/dataclaw/migrate.py +283 -0
  177. package/extensions/services/dataclaw/models/__init__.py +0 -0
  178. package/extensions/services/dataclaw/module.md +49 -0
  179. package/extensions/services/dataclaw/requirements.txt +18 -0
  180. package/extensions/services/dataclaw/server.py +759 -0
  181. package/extensions/services/dataclaw/services/__init__.py +0 -0
  182. package/extensions/services/dataclaw/services/agent_service.py +132 -0
  183. package/extensions/services/dataclaw/services/credit_service.py +235 -0
  184. package/extensions/services/dataclaw/services/email_service.py +140 -0
  185. package/extensions/services/dataclaw/services/feed_service.py +259 -0
  186. package/extensions/services/dataclaw/services/notification_service.py +209 -0
  187. package/extensions/services/dataclaw/services/oauth_service.py +275 -0
  188. package/extensions/services/dataclaw/services/pricing.py +102 -0
  189. package/extensions/services/dataclaw/services/quality.py +79 -0
  190. package/extensions/services/dataclaw/services/reputation.py +142 -0
  191. package/extensions/services/dataclaw/services/sms_service.py +174 -0
  192. package/extensions/services/dataclaw/static/css/common.css +853 -0
  193. package/extensions/services/dataclaw/static/css/themes/blue.css +42 -0
  194. package/extensions/services/dataclaw/static/css/themes/dark.css +42 -0
  195. package/extensions/services/dataclaw/static/css/themes/light.css +35 -0
  196. package/extensions/services/dataclaw/static/js/api.js +103 -0
  197. package/extensions/services/dataclaw/static/js/common.js +321 -0
  198. package/extensions/services/dataclaw/static/js/i18n.js +95 -0
  199. package/extensions/services/dataclaw/static/js/pages/admin.js +152 -0
  200. package/extensions/services/dataclaw/static/js/pages/dashboard.js +82 -0
  201. package/extensions/services/dataclaw/static/js/pages/feed-detail.js +180 -0
  202. package/extensions/services/dataclaw/static/js/pages/feed-manage.js +158 -0
  203. package/extensions/services/dataclaw/static/js/theme.js +46 -0
  204. package/extensions/services/dataclaw/static/locales/en-US.json +464 -0
  205. package/extensions/services/dataclaw/static/locales/ja-JP.json +464 -0
  206. package/extensions/services/dataclaw/static/locales/zh-CN.json +464 -0
  207. package/extensions/services/dataclaw/templates/admin/index.html +90 -0
  208. package/extensions/services/dataclaw/templates/base.html +136 -0
  209. package/extensions/services/dataclaw/templates/credits/balance.html +106 -0
  210. package/extensions/services/dataclaw/templates/credits/deposit.html +164 -0
  211. package/extensions/services/dataclaw/templates/credits/history.html +90 -0
  212. package/extensions/services/dataclaw/templates/dashboard.html +52 -0
  213. package/extensions/services/dataclaw/templates/demands/create.html +78 -0
  214. package/extensions/services/dataclaw/templates/demands/detail.html +136 -0
  215. package/extensions/services/dataclaw/templates/demands/list.html +94 -0
  216. package/extensions/services/dataclaw/templates/feeds/create.html +95 -0
  217. package/extensions/services/dataclaw/templates/feeds/detail.html +110 -0
  218. package/extensions/services/dataclaw/templates/feeds/list.html +110 -0
  219. package/extensions/services/dataclaw/templates/feeds/manage.html +88 -0
  220. package/extensions/services/dataclaw/templates/index.html +185 -0
  221. package/extensions/services/dataclaw/templates/login.html +246 -0
  222. package/extensions/services/dataclaw/templates/register.html +164 -0
  223. package/extensions/services/dataclaw/templates/settings/notifications.html +96 -0
  224. package/extensions/services/dataclaw/templates/settings/profile.html +167 -0
  225. package/extensions/services/dataclaw/templates/subscriptions/list.html +64 -0
  226. package/extensions/services/dataclaw/tests/__init__.py +0 -0
  227. package/extensions/services/dataclaw/tests/conftest.py +68 -0
  228. package/extensions/services/dataclaw/tests/integration/__init__.py +0 -0
  229. package/extensions/services/dataclaw/tests/integration/test_workflows.py +239 -0
  230. package/extensions/services/dataclaw/tests/unit/__init__.py +0 -0
  231. package/extensions/services/dataclaw/tests/unit/test_admin.py +70 -0
  232. package/extensions/services/dataclaw/tests/unit/test_copyright.py +63 -0
  233. package/extensions/services/dataclaw/tests/unit/test_credits.py +80 -0
  234. package/extensions/services/dataclaw/tests/unit/test_data.py +98 -0
  235. package/extensions/services/dataclaw/tests/unit/test_demands.py +106 -0
  236. package/extensions/services/dataclaw/tests/unit/test_feeds.py +98 -0
  237. package/extensions/services/dataclaw/tests/unit/test_identity.py +88 -0
  238. package/extensions/services/dataclaw/tests/unit/test_notifications.py +36 -0
  239. package/extensions/services/dataclaw/tests/unit/test_reviews.py +68 -0
  240. package/extensions/services/dataclaw/tests/unit/test_search.py +64 -0
  241. package/extensions/services/dataclaw/tests/unit/test_subscriptions.py +65 -0
  242. package/extensions/services/dataclaw/tests/unit/test_system.py +106 -0
  243. package/extensions/services/dataclaw/utils/__init__.py +0 -0
  244. package/extensions/services/dataclaw/utils/crypto.py +38 -0
  245. package/extensions/services/dataclaw/utils/id_generator.py +52 -0
  246. package/extensions/services/dataclaw/ws/__init__.py +0 -0
  247. package/extensions/services/dataclaw/ws/handler.py +163 -0
  248. package/extensions/services/dataclaw//345/215/217/350/256/2561-/351/241/271/347/233/256/346/235/241/344/273/266/346/216/210/346/235/203/344/270/216/350/202/241/346/235/203/345/257/271/344/273/267/345/215/217/350/256/256.md +243 -0
  249. package/extensions/services/dataclaw//345/215/217/350/256/2562-/351/241/271/347/233/256/350/264/255/344/271/260/346/235/203/344/270/216/345/244/226/345/214/205/345/247/224/346/211/230/345/274/200/345/217/221/345/215/217/350/256/256.md +434 -0
  250. package/extensions/services/evol/__init__.py +1 -0
  251. package/extensions/services/evol/async_http.py +551 -0
  252. package/extensions/services/evol/auth_manager.py +602 -443
  253. package/extensions/services/evol/config.json5 +16 -0
  254. package/extensions/services/evol/entry.py +568 -406
  255. package/extensions/services/evol/evol_api.py +969 -173
  256. package/extensions/services/evol/mfa_totp.py +77 -0
  257. package/extensions/services/evol/module.md +150 -32
  258. package/extensions/services/evol/nonce_pool.py +113 -0
  259. package/extensions/services/evol/oauth_manager.py +223 -0
  260. package/extensions/services/evol/pairing.py +3 -2
  261. package/extensions/services/evol/pairing_codes.jsonl +1 -0
  262. package/extensions/services/evol/relay.py +1031 -682
  263. package/extensions/services/evol/relay_config.json5 +85 -67
  264. package/extensions/services/evol/routes/routes_llm.py +231 -0
  265. package/extensions/services/evol/routes/routes_rpc.py +90 -89
  266. package/extensions/services/evol/routes/routes_test.py +11 -4
  267. package/extensions/services/evol/server.py +2426 -875
  268. package/extensions/services/evol/static/assets/CommissionView-Cs_ys6Gm.js +1 -0
  269. package/extensions/services/evol/static/assets/CommissionView-DACet_Oo.css +1 -0
  270. package/extensions/services/evol/static/assets/IframePage-DbO11U9G.js +1 -0
  271. package/extensions/services/evol/static/assets/IframePage-c572lT8i.css +1 -0
  272. package/extensions/services/evol/static/assets/TeamDetailView-DULrGD7k.css +1 -0
  273. package/extensions/services/evol/static/assets/TeamDetailView-gy_MBEqG.js +139 -0
  274. package/extensions/services/evol/static/assets/element-plus-Bd7pZkkM.js +63 -0
  275. package/extensions/services/evol/static/assets/index-CmMONKzG.css +1 -0
  276. package/extensions/services/evol/static/assets/index-D44bBe__.js +2 -0
  277. package/extensions/services/evol/static/assets/vue-vendor-DtF-__I4.js +29 -0
  278. package/extensions/services/evol/static/index.html +16 -781
  279. package/extensions/services/evol/static/logo.png +0 -0
  280. package/extensions/services/evol/stats_manager.py +243 -240
  281. package/extensions/services/evol/web/README.md +89 -0
  282. package/extensions/services/evol/web/build.bat +44 -0
  283. package/extensions/services/evol/web/index.html +13 -0
  284. package/extensions/services/evol/web/package-lock.json +1718 -0
  285. package/extensions/services/evol/web/package.json +26 -0
  286. package/extensions/services/evol/web/public/logo.png +0 -0
  287. package/extensions/services/evol/web/src/App.vue +7 -0
  288. package/extensions/services/evol/web/src/components/layout/AppHeader.vue +202 -0
  289. package/extensions/services/evol/web/src/components/layout/AppLayout.vue +61 -0
  290. package/extensions/services/evol/web/src/components/layout/AppSidebar.vue +115 -0
  291. package/extensions/services/evol/web/src/components/login/LoginPage.vue +271 -0
  292. package/extensions/services/evol/web/src/components/team/AddMemberModal.vue +181 -0
  293. package/extensions/services/evol/web/src/components/team/GroupTreeNode.vue +156 -0
  294. package/extensions/services/evol/web/src/components/team/TeamAlertConfig.vue +221 -0
  295. package/extensions/services/evol/web/src/components/team/TeamBillModal.vue +165 -0
  296. package/extensions/services/evol/web/src/components/team/TeamMembersAndGroups.vue +499 -0
  297. package/extensions/services/evol/web/src/components/team/TeamStatsPanel.vue +907 -0
  298. package/extensions/services/evol/web/src/components/team/TreeNode.vue +331 -0
  299. package/extensions/services/evol/web/src/components/team/stats/StatsExportProgress.vue +44 -0
  300. package/extensions/services/evol/web/src/components/team/stats/StatsHeader.vue +89 -0
  301. package/extensions/services/evol/web/src/components/team/stats/StatsMemberDetail.vue +415 -0
  302. package/extensions/services/evol/web/src/components/team/stats/StatsSummary.vue +42 -0
  303. package/extensions/services/evol/web/src/components/team/stats/helpers.ts +195 -0
  304. package/extensions/services/evol/web/src/components/team/stats/stats.css +741 -0
  305. package/extensions/services/evol/web/src/components/team/stats/useStatsApi.ts +114 -0
  306. package/extensions/services/evol/web/src/components/team/stats/useStatsCharts.ts +242 -0
  307. package/extensions/services/evol/web/src/components/team/stats/useStatsExport.ts +232 -0
  308. package/extensions/services/evol/web/src/composables/useFormatters.ts +42 -0
  309. package/extensions/services/evol/web/src/composables/useTheme.ts +52 -0
  310. package/extensions/services/evol/web/src/env.d.ts +7 -0
  311. package/extensions/services/evol/web/src/i18n/en.ts +361 -0
  312. package/extensions/services/evol/web/src/i18n/index.ts +36 -0
  313. package/extensions/services/evol/web/src/i18n/zh.ts +379 -0
  314. package/extensions/services/evol/web/src/main.ts +21 -0
  315. package/extensions/services/evol/web/src/router/index.ts +81 -0
  316. package/extensions/services/evol/web/src/services/kernel-client.ts +406 -0
  317. package/extensions/services/evol/web/src/stores/auth.ts +189 -0
  318. package/extensions/services/evol/web/src/stores/connection.ts +134 -0
  319. package/extensions/services/evol/web/src/stores/pages.ts +79 -0
  320. package/extensions/services/evol/web/src/styles/base.css +213 -0
  321. package/extensions/services/evol/web/src/styles/variables.css +138 -0
  322. package/extensions/services/evol/web/src/types/rpc.ts +35 -0
  323. package/extensions/services/evol/web/src/types/token.ts +87 -0
  324. package/extensions/services/evol/web/src/views/AccountView.vue +1532 -0
  325. package/extensions/services/evol/web/src/views/AiServiceView.vue +219 -0
  326. package/extensions/services/evol/web/src/views/CommissionView.vue +1220 -0
  327. package/extensions/services/evol/web/src/views/CreditsView.vue +131 -0
  328. package/extensions/services/evol/web/src/views/EndpointView.vue +163 -0
  329. package/extensions/services/evol/web/src/views/IframePage.vue +120 -0
  330. package/extensions/services/evol/web/src/views/TeamDetailView.vue +473 -0
  331. package/extensions/services/evol/web/src/views/TeamView.vue +332 -0
  332. package/extensions/services/evol/web/tsconfig.json +31 -0
  333. package/extensions/services/evol/web/tsconfig.node.json +10 -0
  334. package/extensions/services/evol/web/vite.config.ts +49 -0
  335. package/extensions/services/evolmem/__init__.py +0 -0
  336. package/extensions/services/evolmem/entry.py +387 -0
  337. package/extensions/services/evolmem/hooks/__init__.py +0 -0
  338. package/extensions/services/evolmem/hooks/assistant_stop.py +228 -0
  339. package/extensions/services/evolmem/hooks/common.py +76 -0
  340. package/extensions/services/evolmem/hooks/pre_tool_use.py +56 -0
  341. package/extensions/services/evolmem/hooks/session_end.py +133 -0
  342. package/extensions/services/evolmem/hooks/session_start.py +229 -0
  343. package/extensions/services/evolmem/hooks/user_prompt.py +122 -0
  344. package/extensions/services/evolmem/module.md +48 -0
  345. package/extensions/services/evolmem/prompts/00-server-info.md +28 -0
  346. package/extensions/services/evolmem/prompts/01-behavior.md +46 -0
  347. package/extensions/services/evolmem/prompts/02-summary-format.md +112 -0
  348. package/extensions/services/evolmem/prompts/03-file-query.md +92 -0
  349. package/extensions/services/evolmem/prompts/04-topic-stats.md +11 -0
  350. package/extensions/services/evolmem/prompts/05-recent-topics.md +84 -0
  351. package/extensions/services/evolmem/scripts/__init__.py +0 -0
  352. package/extensions/services/evolmem/scripts/extract_keywords.py +40 -0
  353. package/extensions/services/evolmem/scripts/search_topics.py +91 -0
  354. package/extensions/services/evolmem/server.py +641 -0
  355. package/extensions/services/gateway/entry.py +964 -0
  356. package/extensions/services/gateway/module.md +29 -0
  357. package/extensions/services/gateway/nonce_pool.py +65 -0
  358. package/extensions/services/gateway/relay.py +133 -0
  359. package/extensions/services/gateway/ws_server.py +285 -0
  360. package/extensions/services/kite_console/auth_manager.py +603 -0
  361. package/extensions/services/kite_console/config.json5 +19 -0
  362. package/extensions/services/kite_console/config_loader.py +117 -0
  363. package/extensions/services/kite_console/entry.py +528 -0
  364. package/extensions/services/kite_console/evol_api.py +179 -0
  365. package/extensions/services/kite_console/evol_config.json5 +29 -0
  366. package/extensions/services/kite_console/mfa_totp.py +77 -0
  367. package/extensions/services/kite_console/migrate_tokens.py +122 -0
  368. package/extensions/services/kite_console/module.md +37 -0
  369. package/extensions/services/kite_console/nonce_pool.py +113 -0
  370. package/extensions/services/kite_console/oauth_manager.py +223 -0
  371. package/extensions/services/kite_console/pairing.py +280 -0
  372. package/extensions/services/kite_console/pairing_codes.jsonl +2 -0
  373. package/extensions/services/kite_console/relay.py +1350 -0
  374. package/extensions/services/kite_console/relay_config.json5 +96 -0
  375. package/extensions/services/kite_console/routes/__init__.py +1 -0
  376. package/extensions/services/kite_console/routes/routes_llm.py +231 -0
  377. package/extensions/services/kite_console/routes/routes_proxy.py +115 -0
  378. package/extensions/services/kite_console/routes/routes_rpc.py +89 -0
  379. package/extensions/services/kite_console/routes/routes_test.py +68 -0
  380. package/extensions/services/kite_console/server.py +1742 -0
  381. package/extensions/services/{evol → kite_console}/static/css/style.css +656 -2
  382. package/extensions/services/kite_console/static/index.html +1524 -0
  383. package/extensions/services/{evol → kite_console}/static/js/dialog.js +11 -4
  384. package/extensions/services/kite_console/static/js/evol-app.js +7740 -0
  385. package/extensions/services/{evol/static/js/evol-app.js → kite_console/static/js/evol-app.js.backup} +2777 -1949
  386. package/extensions/services/kite_console/static/js/kernel-client.js +560 -0
  387. package/extensions/services/{evol/static/js/kernel-client.js → kite_console/static/js/kernel-client.js.backup} +41 -3
  388. package/extensions/services/{evol → kite_console}/static/js/registry-tests.js +7 -0
  389. package/extensions/services/kite_console/static/js/tests/ARCHITECTURE.md +67 -0
  390. package/extensions/services/kite_console/static/js/tests/README.md +140 -0
  391. package/extensions/services/kite_console/static/js/tests/index.js +161 -0
  392. package/extensions/services/kite_console/static/js/tests/integration/auth.js +120 -0
  393. package/extensions/services/kite_console/static/js/tests/integration/channel-interaction.js +188 -0
  394. package/extensions/services/kite_console/static/js/tests/integration/elastic-connection.js +115 -0
  395. package/extensions/services/kite_console/static/js/tests/integration/full-workflow.js +43 -0
  396. package/extensions/services/kite_console/static/js/tests/integration/multi-instance.js +304 -0
  397. package/extensions/services/kite_console/static/js/tests/integration/nested-rpc.js +266 -0
  398. package/extensions/services/kite_console/static/js/tests/integration/pingpong.js +25 -0
  399. package/extensions/services/kite_console/static/js/tests/integration/redis.js +227 -0
  400. package/extensions/services/kite_console/static/js/tests/integration/registry-core.js +52 -0
  401. package/extensions/services/kite_console/static/js/tests/integration/remote-deploy.js +85 -0
  402. package/extensions/services/kite_console/static/js/tests/integration/require-init.js +96 -0
  403. package/extensions/services/kite_console/static/js/tests/integration/scaling-control.js +193 -0
  404. package/extensions/services/kite_console/static/js/tests/integration/trace.js +109 -0
  405. package/extensions/services/kite_console/static/js/tests/modules/acp_channel.js +339 -0
  406. package/extensions/services/kite_console/static/js/tests/modules/auth.js +96 -0
  407. package/extensions/services/kite_console/static/js/tests/modules/backup.js +49 -0
  408. package/extensions/services/kite_console/static/js/tests/modules/gateway.js +41 -0
  409. package/extensions/services/kite_console/static/js/tests/modules/kernel.js +90 -0
  410. package/extensions/services/kite_console/static/js/tests/modules/launcher.js +75 -0
  411. package/extensions/services/kite_console/static/js/tests/modules/multi_instance.js +129 -0
  412. package/extensions/services/kite_console/static/js/tests/modules/phone_channel.js +364 -0
  413. package/extensions/services/kite_console/static/js/tests/modules/redis.js +178 -0
  414. package/extensions/services/kite_console/static/js/tests/modules/watchdog.js +60 -0
  415. package/extensions/services/kite_console/static/js/tests/modules/web.js +70 -0
  416. package/extensions/services/kite_console/static/js/tests/test-runner.js +123 -0
  417. package/extensions/services/kite_console/static/js/virtual-list.js +200 -0
  418. package/extensions/services/kite_console/static/test_kernel_client_token.html +352 -0
  419. package/extensions/services/kite_console/stats_manager.py +247 -0
  420. package/extensions/services/logs/README.md +215 -0
  421. package/extensions/services/logs/api_logger.py +37 -0
  422. package/extensions/services/logs/baseline.py +121 -0
  423. package/extensions/services/logs/cleaner.py +76 -0
  424. package/extensions/services/logs/entry.py +449 -0
  425. package/extensions/services/logs/formatter.py +129 -0
  426. package/extensions/services/logs/module.md +38 -0
  427. package/extensions/services/logs/quick_diagnostic.py +128 -0
  428. package/extensions/services/logs/routes/__init__.py +1 -0
  429. package/extensions/services/logs/routes/routes_logs.py +218 -0
  430. package/extensions/services/logs/routes/routes_logs.py.backup +173 -0
  431. package/extensions/services/logs/scanner.py +100 -0
  432. package/extensions/services/logs/searcher.py +263 -0
  433. package/extensions/services/logs/server.py +553 -0
  434. package/extensions/services/logs.zip +0 -0
  435. package/extensions/services/model_service/config.json5 +30 -0
  436. package/extensions/services/model_service/entry.py +620 -171
  437. package/extensions/services/model_service/module.md +11 -2
  438. package/extensions/services/proxy/__init__.py +0 -0
  439. package/extensions/services/proxy/aid_manager.py +419 -0
  440. package/extensions/services/proxy/auth_bridge.py +182 -0
  441. package/extensions/services/proxy/config_store.py +79 -0
  442. package/extensions/services/proxy/entry.py +528 -0
  443. package/extensions/services/proxy/evol/presenter/agentIdPresenter.py +2 -2
  444. package/extensions/services/proxy/evol/presenter/apikeyPresenter.py +18 -28
  445. package/extensions/services/proxy/evol/presenter/configPresenter.py +80 -1127
  446. package/extensions/services/proxy/evol/presenter/userPresenter.py +71 -477
  447. package/extensions/services/proxy/evol/server/claude_proxy_async.py +11 -7
  448. package/extensions/services/proxy/module.md +151 -0
  449. package/extensions/services/proxy/server.py +952 -271
  450. package/extensions/services/redis/ALIGNMENT_CHECKLIST.md +121 -0
  451. package/extensions/services/redis/ALIGNMENT_STATUS.md +548 -0
  452. package/extensions/services/redis/config.json5 +8 -0
  453. package/extensions/services/redis/entry.py +1509 -0
  454. package/extensions/services/redis/entry.py.backup +405 -0
  455. package/extensions/services/redis/module.md +48 -0
  456. package/extensions/services/redis/redis_builtin.py +332 -0
  457. package/extensions/services/redis/redis_external.py +164 -0
  458. package/extensions/services/testUi/entry.py +446 -0
  459. package/extensions/services/testUi/module.md +18 -0
  460. package/extensions/services/testUi/ui/cards.html +131 -0
  461. package/extensions/services/testUi/ui/index.html +22 -0
  462. package/extensions/services/testUi/ui/particles.html +143 -0
  463. package/extensions/services/watchdog/entry.py +1258 -793
  464. package/extensions/services/watchdog/module.md +2 -0
  465. package/extensions/services/watchdog/monitor.py +465 -87
  466. package/extensions/services/web/auth_manager.py +602 -0
  467. package/extensions/services/web/config.json5 +11 -0
  468. package/extensions/services/web/entry.py +598 -478
  469. package/extensions/services/web/mfa_totp.py +77 -0
  470. package/extensions/services/web/module.md +16 -13
  471. package/extensions/services/web/nonce_pool.py +113 -0
  472. package/extensions/services/web/oauth_manager.py +223 -0
  473. package/extensions/services/web/pairing.py +3 -2
  474. package/extensions/services/web/pairing_codes.jsonl +1 -0
  475. package/extensions/services/web/relay.py +442 -63
  476. package/extensions/services/web/relay_config.json5 +1 -2
  477. package/extensions/services/web/routes/routes_rpc.py +6 -6
  478. package/extensions/services/web/server.py +360 -173
  479. package/extensions/services/web/static/index.html +1752 -1738
  480. package/extensions/services/web/static/js/app.js +32 -0
  481. package/extensions/services/web/static/js/kernel-client.js +48 -9
  482. package/extensions/services/web/vendor/bluetooth/audio.py +1 -1
  483. package/extensions/services/web/vendor/config.py +2 -2
  484. package/extensions/services/web/vendor/storage/identity.py +1 -1
  485. package/kernel/entry.py +77 -23
  486. package/kernel/event_hub.py +1122 -74
  487. package/kernel/module.md +2 -1
  488. package/kernel/registry_store.py +208 -11
  489. package/kernel/rpc_router.py +1400 -491
  490. package/kernel/server.py +1021 -134
  491. package/kite_cli/builders/__init__.py +4 -0
  492. package/kite_cli/builders/base.py +67 -0
  493. package/kite_cli/builders/custom.py +31 -0
  494. package/kite_cli/builders/detector.py +56 -0
  495. package/kite_cli/builders/go.py +34 -0
  496. package/kite_cli/builders/gradle.py +41 -0
  497. package/kite_cli/builders/maven.py +36 -0
  498. package/kite_cli/builders/npm.py +44 -0
  499. package/kite_cli/builders/python.py +37 -0
  500. package/kite_cli/commands/BUILD_GUIDE.md +109 -0
  501. package/kite_cli/commands/build.py +142 -0
  502. package/kite_cli/commands/check.py +60 -0
  503. package/kite_cli/commands/config.py +156 -0
  504. package/kite_cli/commands/deps.py +58 -0
  505. package/kite_cli/commands/deps_install.py +7 -7
  506. package/kite_cli/commands/disable.py +162 -0
  507. package/kite_cli/commands/enable.py +162 -0
  508. package/kite_cli/commands/export.py +96 -0
  509. package/kite_cli/commands/import_cmd.py +110 -0
  510. package/kite_cli/commands/install.py +50 -23
  511. package/kite_cli/commands/install_skill.py +107 -0
  512. package/kite_cli/commands/list.py +128 -31
  513. package/kite_cli/commands/outdated.py +202 -0
  514. package/kite_cli/commands/search.py +33 -17
  515. package/kite_cli/commands/update.py +115 -2
  516. package/kite_cli/commands/venv_setup.py +6 -6
  517. package/kite_cli/commands/why.py +48 -0
  518. package/kite_cli/core/config_manager.py +145 -0
  519. package/kite_cli/core/downloader.py +32 -2
  520. package/kite_cli/main.py +151 -5
  521. package/kite_cli/utils/colors.py +153 -0
  522. package/kite_cli/utils/dependency_graph.py +209 -0
  523. package/kite_cli/utils/process.py +55 -0
  524. package/kite_cli/utils/progress.py +207 -0
  525. package/kite_cli/utils/table.py +101 -0
  526. package/launcher/count_lines.py +192 -43
  527. package/launcher/entry.py +4543 -2802
  528. package/launcher/logging_setup.py +54 -1
  529. package/launcher/module.md +32 -6
  530. package/launcher/module_scanner.py +93 -20
  531. package/launcher/process_manager.py +355 -76
  532. package/main.py +6 -0
  533. package/package.json +4 -1
  534. package/requirements.txt +41 -38
  535. package/scripts/auto-fix-deps.py +128 -0
  536. package/scripts/env-manager.js +25 -2
  537. package/scripts/final-test.js +78 -0
  538. package/scripts/setup-python-env.js +700 -191
  539. package/scripts/test-alluser.js +48 -0
  540. package/scripts/test-different-version.js +86 -0
  541. package/scripts/test-direct.js +63 -0
  542. package/scripts/test-extract-installer.js +28 -0
  543. package/scripts/test-install-log.js +54 -0
  544. package/scripts/test-installer.js +39 -0
  545. package/scripts/test-integration.js +250 -0
  546. package/scripts/test-real-install.js +210 -0
  547. package/scripts/test-targetdir.js +49 -0
  548. package/scripts/test-venv-real.js +47 -0
  549. package/scripts/test-venv-simple.js +57 -0
  550. package/scripts/test-wait.js +49 -0
  551. package/scripts/test-with-log.js +63 -0
  552. package/extensions/services/evol/config.yaml +0 -149
  553. package/extensions/services/evol/routes/routes_management_ws.py +0 -127
  554. package/extensions/services/evol/static/index_evol.html +0 -14
  555. package/extensions/services/evol/static/js/app.js +0 -6304
  556. package/extensions/services/evol/static/js/auth.js +0 -326
  557. package/extensions/services/evol/static/js/evol-app-fixed.js +0 -50
  558. package/extensions/services/evol/static/js/evol-app.js.bak +0 -1800
  559. package/extensions/services/evol/static/js/kernel-client-example.js +0 -228
  560. package/extensions/services/evol/static/js/main.js +0 -141
  561. package/extensions/services/evol/static/js/stats.js +0 -217
  562. package/extensions/services/evol/static/js/token-manager.js +0 -175
  563. package/extensions/services/proxy/CHANGELOG_20260308.md +0 -258
  564. package/extensions/services/proxy/_fix_prints.py +0 -133
  565. package/extensions/services/proxy/_fix_prints2.py +0 -87
  566. package/extensions/services/proxy/console_auth.py +0 -109
  567. package/extensions/services/proxy/logs/websocket.log +0 -260
  568. package/extensions/services/proxy/main.py +0 -240
  569. package/extensions/services/proxy/requirements.txt +0 -13
  570. package/extensions/services/web/config.yaml +0 -149
  571. /package/extensions/services/{evol → kite_console}/static/pairing.html +0 -0
  572. /package/extensions/services/{evol → kite_console}/static/test_registry.html +0 -0
  573. /package/extensions/services/{evol → kite_console}/static/test_relay.html +0 -0
@@ -0,0 +1,98 @@
1
+ """
2
+ 单元测试 — Feed 管理 API
3
+ """
4
+ import json
5
+
6
+ import pytest
7
+
8
+
9
+ @pytest.mark.asyncio
10
+ class TestFeedCreate:
11
+ async def test_create_feed(self, client, auth_headers):
12
+ resp = await client.post("/v1/feeds", headers=auth_headers, json={
13
+ "name": "Test GitHub Trending",
14
+ "description": "GitHub Trending 每日热门",
15
+ "schema_def": {"type": "object", "properties": {"title": {"type": "string"}}},
16
+ "update_cycle": "24h",
17
+ "category": ["tech", "github"],
18
+ "tags": ["open-source"],
19
+ "token_cost": 500,
20
+ })
21
+ assert resp.status_code == 200
22
+ data = resp.json()
23
+ assert data["ok"] is True
24
+ assert "feed_id" in data["data"]
25
+
26
+ async def test_create_feed_missing_name(self, client, auth_headers):
27
+ resp = await client.post("/v1/feeds", headers=auth_headers, json={
28
+ "schema_def": {"type": "object"},
29
+ "update_cycle": "1h",
30
+ })
31
+ assert resp.status_code in (400, 422)
32
+
33
+ async def test_create_feed_unauthorized(self, client):
34
+ resp = await client.post("/v1/feeds", json={
35
+ "name": "no-auth-feed",
36
+ "schema_def": {},
37
+ "update_cycle": "1h",
38
+ })
39
+ assert resp.status_code == 401
40
+
41
+
42
+ @pytest.mark.asyncio
43
+ class TestFeedRead:
44
+ async def test_get_feed(self, client, auth_headers):
45
+ # 先创建
46
+ create_resp = await client.post("/v1/feeds", headers=auth_headers, json={
47
+ "name": "Read Test Feed",
48
+ "schema_def": {"type": "object"},
49
+ "update_cycle": "1h",
50
+ })
51
+ feed_id = create_resp.json()["data"]["feed_id"]
52
+
53
+ resp = await client.get(f"/v1/feeds/{feed_id}", headers=auth_headers)
54
+ assert resp.status_code == 200
55
+ data = resp.json()
56
+ assert data["ok"] is True
57
+ assert data["data"]["name"] == "Read Test Feed"
58
+
59
+ async def test_get_nonexistent_feed(self, client, auth_headers):
60
+ resp = await client.get("/v1/feeds/nonexistent-feed-xyz", headers=auth_headers)
61
+ assert resp.status_code in (200, 404)
62
+ if resp.status_code == 200:
63
+ assert resp.json()["ok"] is False
64
+
65
+
66
+ @pytest.mark.asyncio
67
+ class TestFeedUpdate:
68
+ async def test_update_feed(self, client, auth_headers):
69
+ create_resp = await client.post("/v1/feeds", headers=auth_headers, json={
70
+ "name": "Update Test Feed",
71
+ "schema_def": {"type": "object"},
72
+ "update_cycle": "1h",
73
+ })
74
+ feed_id = create_resp.json()["data"]["feed_id"]
75
+
76
+ resp = await client.patch(f"/v1/feeds/{feed_id}", headers=auth_headers, json={
77
+ "description": "updated description",
78
+ })
79
+ assert resp.status_code == 200
80
+ assert resp.json()["ok"] is True
81
+
82
+
83
+ @pytest.mark.asyncio
84
+ class TestFeedStats:
85
+ async def test_get_stats(self, client, auth_headers):
86
+ create_resp = await client.post("/v1/feeds", headers=auth_headers, json={
87
+ "name": "Stats Test Feed",
88
+ "schema_def": {"type": "object"},
89
+ "update_cycle": "1h",
90
+ })
91
+ feed_id = create_resp.json()["data"]["feed_id"]
92
+
93
+ resp = await client.get(f"/v1/feeds/{feed_id}/stats", headers=auth_headers)
94
+ assert resp.status_code == 200
95
+ data = resp.json()
96
+ assert data["ok"] is True
97
+ assert "subscriber_count" in data["data"]
98
+ assert "total_queries" in data["data"]
@@ -0,0 +1,88 @@
1
+ """
2
+ 单元测试 — 身份认证 API
3
+ """
4
+ import pytest
5
+
6
+
7
+ @pytest.mark.asyncio
8
+ class TestRegister:
9
+ async def test_register_success(self, client):
10
+ resp = await client.post("/v1/identity/register", json={
11
+ "name": "unit-reg-test",
12
+ "type": "custom",
13
+ "description": "test agent"
14
+ })
15
+ assert resp.status_code == 200
16
+ data = resp.json()
17
+ assert data["ok"] is True
18
+ assert "agent_id" in data["data"]
19
+ assert "api_key" in data["data"]
20
+ assert data["data"]["api_key"].startswith("dc_live_")
21
+
22
+ async def test_register_missing_name(self, client):
23
+ resp = await client.post("/v1/identity/register", json={
24
+ "type": "custom"
25
+ })
26
+ # 应该返回 422 或 400
27
+ assert resp.status_code in (400, 422)
28
+
29
+ async def test_register_duplicate_name(self, client):
30
+ name = "dup-test-agent"
31
+ await client.post("/v1/identity/register", json={"name": name, "type": "custom"})
32
+ resp = await client.post("/v1/identity/register", json={"name": name, "type": "custom"})
33
+ # 可能成功(不同 ID)或失败,视业务逻辑而定
34
+ assert resp.status_code in (200, 409)
35
+
36
+
37
+ @pytest.mark.asyncio
38
+ class TestProfile:
39
+ async def test_get_profile(self, client, auth_headers):
40
+ resp = await client.get("/v1/identity/profile", headers=auth_headers)
41
+ assert resp.status_code == 200
42
+ data = resp.json()
43
+ assert data["ok"] is True
44
+ assert "agent_id" in data["data"]
45
+ assert data["data"]["name"] == "test-agent-unit"
46
+
47
+ async def test_update_profile(self, client, auth_headers):
48
+ resp = await client.patch("/v1/identity/profile", headers=auth_headers, json={
49
+ "description": "updated description"
50
+ })
51
+ assert resp.status_code == 200
52
+ data = resp.json()
53
+ assert data["ok"] is True
54
+
55
+ async def test_profile_unauthorized(self, client):
56
+ resp = await client.get("/v1/identity/profile")
57
+ assert resp.status_code == 401
58
+
59
+
60
+ @pytest.mark.asyncio
61
+ class TestAPIKeys:
62
+ async def test_list_keys(self, client, auth_headers):
63
+ resp = await client.get("/v1/identity/keys", headers=auth_headers)
64
+ assert resp.status_code == 200
65
+ data = resp.json()
66
+ assert data["ok"] is True
67
+ assert "keys" in data["data"]
68
+
69
+ async def test_create_key(self, client, auth_headers):
70
+ resp = await client.post("/v1/identity/keys", headers=auth_headers, json={
71
+ "name": "test-key"
72
+ })
73
+ assert resp.status_code == 200
74
+ data = resp.json()
75
+ assert data["ok"] is True
76
+ assert "api_key" in data["data"]
77
+ return data["data"]
78
+
79
+ async def test_revoke_key(self, client, auth_headers):
80
+ # 先创建一个 key
81
+ create_resp = await client.post("/v1/identity/keys", headers=auth_headers, json={
82
+ "name": "to-revoke"
83
+ })
84
+ key_id = create_resp.json()["data"]["key_id"]
85
+ # 撤销
86
+ resp = await client.delete(f"/v1/identity/keys/{key_id}", headers=auth_headers)
87
+ assert resp.status_code == 200
88
+ assert resp.json()["ok"] is True
@@ -0,0 +1,36 @@
1
+ """
2
+ 单元测试 — 通知系统 API
3
+ """
4
+ import pytest
5
+
6
+
7
+ @pytest.mark.asyncio
8
+ class TestNotifications:
9
+ async def test_list_notifications(self, client, auth_headers):
10
+ resp = await client.get("/v1/notifications", headers=auth_headers)
11
+ assert resp.status_code == 200
12
+ data = resp.json()
13
+ assert data["ok"] is True
14
+ assert "notifications" in data["data"]
15
+ assert "total" in data["data"]
16
+
17
+ async def test_list_unread_only(self, client, auth_headers):
18
+ resp = await client.get("/v1/notifications?unread_only=true", headers=auth_headers)
19
+ assert resp.status_code == 200
20
+
21
+ async def test_unread_count(self, client, auth_headers):
22
+ resp = await client.get("/v1/notifications/unread", headers=auth_headers)
23
+ assert resp.status_code == 200
24
+ data = resp.json()
25
+ assert data["ok"] is True
26
+ assert "unread_count" in data["data"]
27
+ assert isinstance(data["data"]["unread_count"], int)
28
+
29
+ async def test_mark_all_read(self, client, auth_headers):
30
+ resp = await client.post("/v1/notifications/read-all", headers=auth_headers)
31
+ assert resp.status_code == 200
32
+ assert resp.json()["ok"] is True
33
+
34
+ async def test_notifications_unauthorized(self, client):
35
+ resp = await client.get("/v1/notifications")
36
+ assert resp.status_code == 401
@@ -0,0 +1,68 @@
1
+ """
2
+ 单元测试 — 评价与举报 API
3
+ """
4
+ import pytest
5
+
6
+
7
+ @pytest.mark.asyncio
8
+ class TestReviews:
9
+ async def test_submit_review(self, client, auth_headers, second_auth_headers):
10
+ create_resp = await client.post("/v1/feeds", headers=auth_headers, json={
11
+ "name": "Review Test Feed",
12
+ "schema_def": {"type": "object"},
13
+ "update_cycle": "1h",
14
+ })
15
+ feed_id = create_resp.json()["data"]["feed_id"]
16
+
17
+ resp = await client.post(f"/v1/feeds/{feed_id}/reviews", headers=second_auth_headers, json={
18
+ "rating": 5,
19
+ "comment": "非常好的数据接口"
20
+ })
21
+ assert resp.status_code == 200
22
+ assert resp.json()["ok"] is True
23
+
24
+ async def test_list_reviews(self, client, auth_headers):
25
+ create_resp = await client.post("/v1/feeds", headers=auth_headers, json={
26
+ "name": "Review List Test",
27
+ "schema_def": {"type": "object"},
28
+ "update_cycle": "1h",
29
+ })
30
+ feed_id = create_resp.json()["data"]["feed_id"]
31
+
32
+ resp = await client.get(f"/v1/feeds/{feed_id}/reviews")
33
+ assert resp.status_code == 200
34
+ data = resp.json()
35
+ assert data["ok"] is True
36
+ assert "reviews" in data["data"]
37
+
38
+ async def test_review_invalid_rating(self, client, auth_headers):
39
+ create_resp = await client.post("/v1/feeds", headers=auth_headers, json={
40
+ "name": "Invalid Rating Test",
41
+ "schema_def": {"type": "object"},
42
+ "update_cycle": "1h",
43
+ })
44
+ feed_id = create_resp.json()["data"]["feed_id"]
45
+
46
+ resp = await client.post(f"/v1/feeds/{feed_id}/reviews", headers=auth_headers, json={
47
+ "rating": 10, # 超出范围
48
+ "comment": "test"
49
+ })
50
+ assert resp.status_code in (200, 400, 422)
51
+
52
+
53
+ @pytest.mark.asyncio
54
+ class TestReports:
55
+ async def test_submit_report(self, client, auth_headers, second_auth_headers):
56
+ create_resp = await client.post("/v1/feeds", headers=auth_headers, json={
57
+ "name": "Report Test Feed",
58
+ "schema_def": {"type": "object"},
59
+ "update_cycle": "1h",
60
+ })
61
+ feed_id = create_resp.json()["data"]["feed_id"]
62
+
63
+ resp = await client.post(f"/v1/feeds/{feed_id}/report", headers=second_auth_headers, json={
64
+ "reason": "fake_data",
65
+ "description": "数据看起来是伪造的"
66
+ })
67
+ assert resp.status_code == 200
68
+ assert resp.json()["ok"] is True
@@ -0,0 +1,64 @@
1
+ """
2
+ 单元测试 — 搜索与发现 API
3
+ """
4
+ import pytest
5
+
6
+
7
+ @pytest.mark.asyncio
8
+ class TestSearchFeeds:
9
+ async def test_search_all(self, client):
10
+ resp = await client.get("/v1/search/feeds")
11
+ assert resp.status_code == 200
12
+ data = resp.json()
13
+ assert data["ok"] is True
14
+ assert "feeds" in data["data"]
15
+ assert "total" in data["data"]
16
+
17
+ async def test_search_with_query(self, client):
18
+ resp = await client.get("/v1/search/feeds?q=test")
19
+ assert resp.status_code == 200
20
+ assert resp.json()["ok"] is True
21
+
22
+ async def test_search_with_sort(self, client):
23
+ resp = await client.get("/v1/search/feeds?sort=reputation")
24
+ assert resp.status_code == 200
25
+
26
+ async def test_search_pagination(self, client):
27
+ resp = await client.get("/v1/search/feeds?limit=2&offset=0")
28
+ assert resp.status_code == 200
29
+ data = resp.json()
30
+ assert data["ok"] is True
31
+
32
+
33
+ @pytest.mark.asyncio
34
+ class TestTrending:
35
+ async def test_trending(self, client):
36
+ resp = await client.get("/v1/trending")
37
+ assert resp.status_code == 200
38
+ data = resp.json()
39
+ assert data["ok"] is True
40
+ assert "feeds" in data["data"]
41
+
42
+
43
+ @pytest.mark.asyncio
44
+ class TestCategories:
45
+ async def test_list_categories(self, client):
46
+ resp = await client.get("/v1/categories")
47
+ assert resp.status_code == 200
48
+ data = resp.json()
49
+ assert data["ok"] is True
50
+ assert "categories" in data["data"]
51
+ assert len(data["data"]["categories"]) > 0
52
+ # 每个分类有 id 和 name
53
+ cat = data["data"]["categories"][0]
54
+ assert "id" in cat
55
+ assert "name" in cat
56
+
57
+
58
+ @pytest.mark.asyncio
59
+ class TestRecommendations:
60
+ async def test_recommendations(self, client, auth_headers):
61
+ resp = await client.get("/v1/recommendations", headers=auth_headers)
62
+ assert resp.status_code == 200
63
+ data = resp.json()
64
+ assert data["ok"] is True
@@ -0,0 +1,65 @@
1
+ """
2
+ 单元测试 — 订阅与时间线 API
3
+ """
4
+ import pytest
5
+
6
+
7
+ @pytest.mark.asyncio
8
+ class TestSubscriptions:
9
+ async def test_subscribe(self, client, auth_headers, second_auth_headers):
10
+ # 用 auth_headers 创建一个 feed
11
+ create_resp = await client.post("/v1/feeds", headers=auth_headers, json={
12
+ "name": "Sub Test Feed",
13
+ "schema_def": {"type": "object"},
14
+ "update_cycle": "1h",
15
+ })
16
+ feed_id = create_resp.json()["data"]["feed_id"]
17
+
18
+ # 用 second_auth 订阅
19
+ resp = await client.post("/v1/subscriptions", headers=second_auth_headers, json={
20
+ "feed_ids": [feed_id]
21
+ })
22
+ assert resp.status_code == 200
23
+ data = resp.json()
24
+ assert data["ok"] is True
25
+
26
+ async def test_list_subscriptions(self, client, second_auth_headers):
27
+ resp = await client.get("/v1/subscriptions", headers=second_auth_headers)
28
+ assert resp.status_code == 200
29
+ data = resp.json()
30
+ assert data["ok"] is True
31
+ assert "subscriptions" in data["data"]
32
+
33
+ async def test_unsubscribe(self, client, auth_headers, second_auth_headers):
34
+ create_resp = await client.post("/v1/feeds", headers=auth_headers, json={
35
+ "name": "Unsub Test Feed",
36
+ "schema_def": {"type": "object"},
37
+ "update_cycle": "1h",
38
+ })
39
+ feed_id = create_resp.json()["data"]["feed_id"]
40
+ await client.post("/v1/subscriptions", headers=second_auth_headers, json={
41
+ "feed_ids": [feed_id]
42
+ })
43
+
44
+ resp = await client.delete("/v1/subscriptions", headers=second_auth_headers,
45
+ content='{"feed_ids":["' + feed_id + '"]}')
46
+ assert resp.status_code == 200
47
+ assert resp.json()["ok"] is True
48
+
49
+ async def test_subscribe_unauthorized(self, client):
50
+ resp = await client.post("/v1/subscriptions", json={"feed_ids": ["test"]})
51
+ assert resp.status_code == 401
52
+
53
+
54
+ @pytest.mark.asyncio
55
+ class TestTimeline:
56
+ async def test_timeline(self, client, auth_headers):
57
+ resp = await client.get("/v1/timeline", headers=auth_headers)
58
+ assert resp.status_code == 200
59
+ data = resp.json()
60
+ assert data["ok"] is True
61
+ assert "items" in data["data"]
62
+
63
+ async def test_timeline_with_limit(self, client, auth_headers):
64
+ resp = await client.get("/v1/timeline?limit=5", headers=auth_headers)
65
+ assert resp.status_code == 200
@@ -0,0 +1,106 @@
1
+ """
2
+ 单元测试 — 系统基础端点(健康检查、服务发现、首页)
3
+ """
4
+ import pytest
5
+
6
+
7
+ @pytest.mark.asyncio
8
+ class TestHealthEndpoint:
9
+ async def test_health_ok(self, client):
10
+ resp = await client.get("/health")
11
+ assert resp.status_code == 200
12
+ data = resp.json()
13
+ assert data["ok"] is True
14
+ assert data["service"] == "dataclaw"
15
+ assert data["version"] == "2.0"
16
+ assert "database" in data
17
+ assert "uptime_ms" in data
18
+
19
+ async def test_health_has_db_status(self, client):
20
+ resp = await client.get("/health")
21
+ data = resp.json()
22
+ assert data["database"] in ("ok", "error")
23
+
24
+
25
+ @pytest.mark.asyncio
26
+ class TestDiscoveryEndpoint:
27
+ async def test_well_known(self, client):
28
+ resp = await client.get("/.well-known/agent-data-exchange.json")
29
+ assert resp.status_code == 200
30
+ data = resp.json()
31
+ assert data["platform"] == "DataClaw"
32
+ assert "endpoints" in data
33
+ assert "capabilities" in data
34
+ assert "quick_start" in data
35
+
36
+ async def test_discovery_capabilities(self, client):
37
+ resp = await client.get("/.well-known/agent-data-exchange.json")
38
+ caps = resp.json()["capabilities"]
39
+ required = ["feed_registry", "data_query", "subscription", "credit_system", "search"]
40
+ for cap in required:
41
+ assert cap in caps
42
+
43
+
44
+ @pytest.mark.asyncio
45
+ class TestPageRoutes:
46
+ """测试所有多页面路由可访问"""
47
+
48
+ @pytest.mark.parametrize("path", [
49
+ "/", "/login", "/register", "/feeds",
50
+ "/feeds/create", "/demands", "/demands/create",
51
+ ])
52
+ async def test_public_pages(self, client, path):
53
+ resp = await client.get(path)
54
+ assert resp.status_code == 200
55
+ assert "DataClaw" in resp.text
56
+
57
+ @pytest.mark.parametrize("path", [
58
+ "/dashboard", "/subscriptions", "/credits",
59
+ "/credits/history", "/credits/deposit",
60
+ "/settings", "/settings/notifications", "/admin",
61
+ ])
62
+ async def test_authenticated_pages(self, client, path):
63
+ resp = await client.get(path)
64
+ assert resp.status_code == 200
65
+
66
+ async def test_feed_detail_page(self, client):
67
+ resp = await client.get("/feeds/test-feed-123")
68
+ assert resp.status_code == 200
69
+
70
+ async def test_demand_detail_page(self, client):
71
+ resp = await client.get("/demands/dm_test123")
72
+ assert resp.status_code == 200
73
+
74
+
75
+ @pytest.mark.asyncio
76
+ class TestStaticFiles:
77
+ async def test_common_css(self, client):
78
+ resp = await client.get("/static/css/common.css")
79
+ assert resp.status_code == 200
80
+ assert "var(--bg)" in resp.text
81
+
82
+ async def test_common_js(self, client):
83
+ resp = await client.get("/static/js/common.js")
84
+ assert resp.status_code == 200
85
+
86
+ async def test_theme_js(self, client):
87
+ resp = await client.get("/static/js/theme.js")
88
+ assert resp.status_code == 200
89
+
90
+ async def test_i18n_js(self, client):
91
+ resp = await client.get("/static/js/i18n.js")
92
+ assert resp.status_code == 200
93
+
94
+ async def test_zh_cn_locale(self, client):
95
+ resp = await client.get("/static/locales/zh-CN.json")
96
+ assert resp.status_code == 200
97
+ data = resp.json()
98
+ assert "nav" in data
99
+
100
+ async def test_en_us_locale(self, client):
101
+ resp = await client.get("/static/locales/en-US.json")
102
+ assert resp.status_code == 200
103
+
104
+ async def test_theme_dark_css(self, client):
105
+ resp = await client.get("/static/css/themes/dark.css")
106
+ assert resp.status_code == 200
File without changes
@@ -0,0 +1,38 @@
1
+ """
2
+ 加密工具:API Key 哈希、密码哈希
3
+ """
4
+ import hashlib
5
+ import hmac
6
+ import secrets
7
+
8
+
9
+ def hash_api_key(api_key: str) -> str:
10
+ return hashlib.sha256(api_key.encode()).hexdigest()
11
+
12
+
13
+ def verify_api_key(api_key: str, stored_hash: str) -> bool:
14
+ return hmac.compare_digest(hash_api_key(api_key), stored_hash)
15
+
16
+
17
+ def make_token(nbytes: int = 32) -> str:
18
+ return secrets.token_hex(nbytes)
19
+
20
+
21
+ def hash_password(password: str) -> str:
22
+ try:
23
+ import bcrypt
24
+ return bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()
25
+ except ImportError:
26
+ import hashlib
27
+ return hashlib.sha256(password.encode()).hexdigest()
28
+
29
+
30
+ def verify_password(password: str, hashed: str) -> bool:
31
+ try:
32
+ import bcrypt
33
+ return bcrypt.checkpw(password.encode(), hashed.encode())
34
+ except ImportError:
35
+ import hashlib
36
+ return hashlib.sha256(password.encode()).hexdigest() == hashed
37
+ except Exception:
38
+ return False
@@ -0,0 +1,52 @@
1
+ """
2
+ ID 生成器
3
+ """
4
+ import random
5
+ import re
6
+ import string
7
+ import uuid
8
+
9
+
10
+ def gen_agent_id() -> str:
11
+ chars = string.ascii_letters + string.digits
12
+ return "ag_" + "".join(random.choices(chars, k=8))
13
+
14
+
15
+ def gen_feed_id(name: str) -> str:
16
+ clean = re.sub(r'[^a-zA-Z0-9\s-]', '', name).strip().lower()
17
+ slug = re.sub(r'[\s_]+', '-', clean)[:40].strip('-')
18
+ suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=6))
19
+ return f"{slug}-{suffix}" if slug else f"feed-{suffix}"
20
+
21
+
22
+ def gen_demand_id() -> str:
23
+ return "dm_" + "".join(random.choices(string.ascii_lowercase + string.digits, k=10))
24
+
25
+
26
+ def gen_key_id() -> str:
27
+ return "kid_" + "".join(random.choices(string.ascii_lowercase + string.digits, k=12))
28
+
29
+
30
+ def gen_api_key() -> str:
31
+ raw = "".join(random.choices(string.ascii_letters + string.digits, k=36))
32
+ return f"dc_live_{raw}"
33
+
34
+
35
+ def gen_complaint_id() -> str:
36
+ return "cp_" + "".join(random.choices(string.ascii_lowercase + string.digits, k=10))
37
+
38
+
39
+ def gen_verify_code(length: int = 6) -> str:
40
+ return "".join(random.choices(string.digits, k=length))
41
+
42
+
43
+ def gen_uuid() -> str:
44
+ return str(uuid.uuid4()).replace("-", "")
45
+
46
+
47
+ def gen_notif_id() -> str:
48
+ return "nt_" + "".join(random.choices(string.ascii_lowercase + string.digits, k=12))
49
+
50
+
51
+ def gen_sub_id() -> str:
52
+ return "sub_" + "".join(random.choices(string.ascii_lowercase + string.digits, k=10))
File without changes