cloakbot 0.2.1b1__tar.gz

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 (611) hide show
  1. cloakbot-0.2.1b1/.gitignore +57 -0
  2. cloakbot-0.2.1b1/LICENSE +22 -0
  3. cloakbot-0.2.1b1/PKG-INFO +371 -0
  4. cloakbot-0.2.1b1/README.md +275 -0
  5. cloakbot-0.2.1b1/bridge/.nvmrc +1 -0
  6. cloakbot-0.2.1b1/bridge/package-lock.json +1416 -0
  7. cloakbot-0.2.1b1/bridge/package.json +26 -0
  8. cloakbot-0.2.1b1/bridge/src/index.ts +56 -0
  9. cloakbot-0.2.1b1/bridge/src/server.ts +155 -0
  10. cloakbot-0.2.1b1/bridge/src/types.d.ts +3 -0
  11. cloakbot-0.2.1b1/bridge/src/whatsapp.ts +293 -0
  12. cloakbot-0.2.1b1/bridge/tsconfig.json +16 -0
  13. cloakbot-0.2.1b1/cloakbot/__init__.py +49 -0
  14. cloakbot-0.2.1b1/cloakbot/__main__.py +8 -0
  15. cloakbot-0.2.1b1/cloakbot/agent/__init__.py +19 -0
  16. cloakbot-0.2.1b1/cloakbot/agent/autocompact.py +96 -0
  17. cloakbot-0.2.1b1/cloakbot/agent/context.py +280 -0
  18. cloakbot-0.2.1b1/cloakbot/agent/hook.py +141 -0
  19. cloakbot-0.2.1b1/cloakbot/agent/loop.py +1968 -0
  20. cloakbot-0.2.1b1/cloakbot/agent/memory.py +955 -0
  21. cloakbot-0.2.1b1/cloakbot/agent/model_presets.py +65 -0
  22. cloakbot-0.2.1b1/cloakbot/agent/progress_hook.py +178 -0
  23. cloakbot-0.2.1b1/cloakbot/agent/runner.py +1453 -0
  24. cloakbot-0.2.1b1/cloakbot/agent/skills.py +242 -0
  25. cloakbot-0.2.1b1/cloakbot/agent/subagent.py +401 -0
  26. cloakbot-0.2.1b1/cloakbot/agent/tools/__init__.py +31 -0
  27. cloakbot-0.2.1b1/cloakbot/agent/tools/apply_patch.py +290 -0
  28. cloakbot-0.2.1b1/cloakbot/agent/tools/base.py +296 -0
  29. cloakbot-0.2.1b1/cloakbot/agent/tools/cli_apps.py +133 -0
  30. cloakbot-0.2.1b1/cloakbot/agent/tools/context.py +60 -0
  31. cloakbot-0.2.1b1/cloakbot/agent/tools/cron.py +295 -0
  32. cloakbot-0.2.1b1/cloakbot/agent/tools/exec_session.py +598 -0
  33. cloakbot-0.2.1b1/cloakbot/agent/tools/file_state.py +205 -0
  34. cloakbot-0.2.1b1/cloakbot/agent/tools/filesystem.py +1046 -0
  35. cloakbot-0.2.1b1/cloakbot/agent/tools/image_generation.py +218 -0
  36. cloakbot-0.2.1b1/cloakbot/agent/tools/loader.py +116 -0
  37. cloakbot-0.2.1b1/cloakbot/agent/tools/long_task.py +272 -0
  38. cloakbot-0.2.1b1/cloakbot/agent/tools/mcp.py +1096 -0
  39. cloakbot-0.2.1b1/cloakbot/agent/tools/message.py +273 -0
  40. cloakbot-0.2.1b1/cloakbot/agent/tools/path_utils.py +30 -0
  41. cloakbot-0.2.1b1/cloakbot/agent/tools/registry.py +125 -0
  42. cloakbot-0.2.1b1/cloakbot/agent/tools/runtime_state.py +62 -0
  43. cloakbot-0.2.1b1/cloakbot/agent/tools/sandbox.py +55 -0
  44. cloakbot-0.2.1b1/cloakbot/agent/tools/schema.py +232 -0
  45. cloakbot-0.2.1b1/cloakbot/agent/tools/search.py +584 -0
  46. cloakbot-0.2.1b1/cloakbot/agent/tools/self.py +484 -0
  47. cloakbot-0.2.1b1/cloakbot/agent/tools/shell.py +652 -0
  48. cloakbot-0.2.1b1/cloakbot/agent/tools/spawn.py +96 -0
  49. cloakbot-0.2.1b1/cloakbot/agent/tools/web.py +864 -0
  50. cloakbot-0.2.1b1/cloakbot/api/__init__.py +1 -0
  51. cloakbot-0.2.1b1/cloakbot/api/server.py +399 -0
  52. cloakbot-0.2.1b1/cloakbot/apps/__init__.py +5 -0
  53. cloakbot-0.2.1b1/cloakbot/apps/cli/__init__.py +13 -0
  54. cloakbot-0.2.1b1/cloakbot/apps/cli/service.py +1238 -0
  55. cloakbot-0.2.1b1/cloakbot/apps/cli/utils.py +62 -0
  56. cloakbot-0.2.1b1/cloakbot/apps/protocol.py +56 -0
  57. cloakbot-0.2.1b1/cloakbot/bus/__init__.py +6 -0
  58. cloakbot-0.2.1b1/cloakbot/bus/events.py +53 -0
  59. cloakbot-0.2.1b1/cloakbot/bus/progress.py +70 -0
  60. cloakbot-0.2.1b1/cloakbot/bus/queue.py +44 -0
  61. cloakbot-0.2.1b1/cloakbot/bus/runtime_events.py +251 -0
  62. cloakbot-0.2.1b1/cloakbot/channels/__init__.py +6 -0
  63. cloakbot-0.2.1b1/cloakbot/channels/base.py +270 -0
  64. cloakbot-0.2.1b1/cloakbot/channels/dingtalk.py +759 -0
  65. cloakbot-0.2.1b1/cloakbot/channels/discord.py +818 -0
  66. cloakbot-0.2.1b1/cloakbot/channels/email.py +739 -0
  67. cloakbot-0.2.1b1/cloakbot/channels/feishu.py +1917 -0
  68. cloakbot-0.2.1b1/cloakbot/channels/manager.py +535 -0
  69. cloakbot-0.2.1b1/cloakbot/channels/matrix.py +1022 -0
  70. cloakbot-0.2.1b1/cloakbot/channels/mochat.py +943 -0
  71. cloakbot-0.2.1b1/cloakbot/channels/msteams.py +822 -0
  72. cloakbot-0.2.1b1/cloakbot/channels/napcat.py +579 -0
  73. cloakbot-0.2.1b1/cloakbot/channels/qq.py +701 -0
  74. cloakbot-0.2.1b1/cloakbot/channels/registry.py +95 -0
  75. cloakbot-0.2.1b1/cloakbot/channels/signal.py +1402 -0
  76. cloakbot-0.2.1b1/cloakbot/channels/slack.py +729 -0
  77. cloakbot-0.2.1b1/cloakbot/channels/telegram.py +1453 -0
  78. cloakbot-0.2.1b1/cloakbot/channels/websocket.py +1173 -0
  79. cloakbot-0.2.1b1/cloakbot/channels/websocket_privacy.py +185 -0
  80. cloakbot-0.2.1b1/cloakbot/channels/wecom.py +554 -0
  81. cloakbot-0.2.1b1/cloakbot/channels/weixin.py +1546 -0
  82. cloakbot-0.2.1b1/cloakbot/channels/whatsapp.py +383 -0
  83. cloakbot-0.2.1b1/cloakbot/cli/__init__.py +1 -0
  84. cloakbot-0.2.1b1/cloakbot/cli/commands.py +1940 -0
  85. cloakbot-0.2.1b1/cloakbot/cli/models.py +31 -0
  86. cloakbot-0.2.1b1/cloakbot/cli/onboard.py +1396 -0
  87. cloakbot-0.2.1b1/cloakbot/cli/stream.py +230 -0
  88. cloakbot-0.2.1b1/cloakbot/cloakbot.py +110 -0
  89. cloakbot-0.2.1b1/cloakbot/command/__init__.py +6 -0
  90. cloakbot-0.2.1b1/cloakbot/command/builtin.py +686 -0
  91. cloakbot-0.2.1b1/cloakbot/command/router.py +88 -0
  92. cloakbot-0.2.1b1/cloakbot/config/__init__.py +34 -0
  93. cloakbot-0.2.1b1/cloakbot/config/loader.py +177 -0
  94. cloakbot-0.2.1b1/cloakbot/config/paths.py +76 -0
  95. cloakbot-0.2.1b1/cloakbot/config/schema.py +590 -0
  96. cloakbot-0.2.1b1/cloakbot/cron/__init__.py +18 -0
  97. cloakbot-0.2.1b1/cloakbot/cron/service.py +664 -0
  98. cloakbot-0.2.1b1/cloakbot/cron/types.py +83 -0
  99. cloakbot-0.2.1b1/cloakbot/pairing/__init__.py +33 -0
  100. cloakbot-0.2.1b1/cloakbot/pairing/store.py +254 -0
  101. cloakbot-0.2.1b1/cloakbot/privacy/__init__.py +6 -0
  102. cloakbot-0.2.1b1/cloakbot/privacy/agents/__init__.py +15 -0
  103. cloakbot-0.2.1b1/cloakbot/privacy/agents/base.py +17 -0
  104. cloakbot-0.2.1b1/cloakbot/privacy/agents/classification/intent_analyzer.py +60 -0
  105. cloakbot-0.2.1b1/cloakbot/privacy/agents/workers/chat_agent.py +25 -0
  106. cloakbot-0.2.1b1/cloakbot/privacy/agents/workers/math_agent.py +22 -0
  107. cloakbot-0.2.1b1/cloakbot/privacy/compaction.py +326 -0
  108. cloakbot-0.2.1b1/cloakbot/privacy/compaction_provider.py +171 -0
  109. cloakbot-0.2.1b1/cloakbot/privacy/core/__init__.py +29 -0
  110. cloakbot-0.2.1b1/cloakbot/privacy/core/detection/chunking/__init__.py +67 -0
  111. cloakbot-0.2.1b1/cloakbot/privacy/core/detection/chunking/base.py +65 -0
  112. cloakbot-0.2.1b1/cloakbot/privacy/core/detection/chunking/html.py +122 -0
  113. cloakbot-0.2.1b1/cloakbot/privacy/core/detection/chunking/json_chunker.py +126 -0
  114. cloakbot-0.2.1b1/cloakbot/privacy/core/detection/chunking/markdown.py +150 -0
  115. cloakbot-0.2.1b1/cloakbot/privacy/core/detection/chunking/sniffer.py +81 -0
  116. cloakbot-0.2.1b1/cloakbot/privacy/core/detection/chunking/text.py +152 -0
  117. cloakbot-0.2.1b1/cloakbot/privacy/core/detection/detector.py +137 -0
  118. cloakbot-0.2.1b1/cloakbot/privacy/core/detection/digit_detector.py +105 -0
  119. cloakbot-0.2.1b1/cloakbot/privacy/core/detection/general_detector.py +335 -0
  120. cloakbot-0.2.1b1/cloakbot/privacy/core/detection/llm_json.py +174 -0
  121. cloakbot-0.2.1b1/cloakbot/privacy/core/detection/tool_detector.py +249 -0
  122. cloakbot-0.2.1b1/cloakbot/privacy/core/math/math_executor.py +328 -0
  123. cloakbot-0.2.1b1/cloakbot/privacy/core/math/math_helpers.py +184 -0
  124. cloakbot-0.2.1b1/cloakbot/privacy/core/sanitization/alias_resolver.py +97 -0
  125. cloakbot-0.2.1b1/cloakbot/privacy/core/sanitization/handler.py +129 -0
  126. cloakbot-0.2.1b1/cloakbot/privacy/core/sanitization/restorer.py +168 -0
  127. cloakbot-0.2.1b1/cloakbot/privacy/core/sanitization/sanitize.py +244 -0
  128. cloakbot-0.2.1b1/cloakbot/privacy/core/state/vault.py +838 -0
  129. cloakbot-0.2.1b1/cloakbot/privacy/core/types.py +267 -0
  130. cloakbot-0.2.1b1/cloakbot/privacy/document_redaction.py +109 -0
  131. cloakbot-0.2.1b1/cloakbot/privacy/egress_policy.py +284 -0
  132. cloakbot-0.2.1b1/cloakbot/privacy/goal_at_rest.py +65 -0
  133. cloakbot-0.2.1b1/cloakbot/privacy/hooks/context.py +51 -0
  134. cloakbot-0.2.1b1/cloakbot/privacy/hooks/post_llm.py +21 -0
  135. cloakbot-0.2.1b1/cloakbot/privacy/hooks/pre_llm.py +33 -0
  136. cloakbot-0.2.1b1/cloakbot/privacy/prompting/__init__.py +19 -0
  137. cloakbot-0.2.1b1/cloakbot/privacy/prompting/system_prompt.py +58 -0
  138. cloakbot-0.2.1b1/cloakbot/privacy/prompting/templates/privacy_mode.md +28 -0
  139. cloakbot-0.2.1b1/cloakbot/privacy/protocol/__init__.py +26 -0
  140. cloakbot-0.2.1b1/cloakbot/privacy/protocol/contracts.py +123 -0
  141. cloakbot-0.2.1b1/cloakbot/privacy/protocol/metrics.py +34 -0
  142. cloakbot-0.2.1b1/cloakbot/privacy/protocol/observability.py +85 -0
  143. cloakbot-0.2.1b1/cloakbot/privacy/protocol/replay.py +85 -0
  144. cloakbot-0.2.1b1/cloakbot/privacy/provider_egress_gate.py +197 -0
  145. cloakbot-0.2.1b1/cloakbot/privacy/runtime/__init__.py +3 -0
  146. cloakbot-0.2.1b1/cloakbot/privacy/runtime/pipeline.py +686 -0
  147. cloakbot-0.2.1b1/cloakbot/privacy/runtime/registry.py +15 -0
  148. cloakbot-0.2.1b1/cloakbot/privacy/runtime/routing.py +17 -0
  149. cloakbot-0.2.1b1/cloakbot/privacy/runtime/streaming_restorer.py +105 -0
  150. cloakbot-0.2.1b1/cloakbot/privacy/runtime/streaming_sanitizer.py +242 -0
  151. cloakbot-0.2.1b1/cloakbot/privacy/runtime/tool_interceptor.py +723 -0
  152. cloakbot-0.2.1b1/cloakbot/privacy/tool_models.py +143 -0
  153. cloakbot-0.2.1b1/cloakbot/privacy/transparency/report.py +180 -0
  154. cloakbot-0.2.1b1/cloakbot/privacy/visual_egress_gate.py +347 -0
  155. cloakbot-0.2.1b1/cloakbot/privacy/visual_redaction.py +1156 -0
  156. cloakbot-0.2.1b1/cloakbot/privacy/webui/__init__.py +45 -0
  157. cloakbot-0.2.1b1/cloakbot/privacy/webui/builders.py +224 -0
  158. cloakbot-0.2.1b1/cloakbot/privacy/webui/contracts.py +202 -0
  159. cloakbot-0.2.1b1/cloakbot/privacy/webui/history.py +69 -0
  160. cloakbot-0.2.1b1/cloakbot/privacy/webui/side_channel.py +328 -0
  161. cloakbot-0.2.1b1/cloakbot/providers/__init__.py +45 -0
  162. cloakbot-0.2.1b1/cloakbot/providers/anthropic_provider.py +692 -0
  163. cloakbot-0.2.1b1/cloakbot/providers/azure_openai_provider.py +186 -0
  164. cloakbot-0.2.1b1/cloakbot/providers/base.py +843 -0
  165. cloakbot-0.2.1b1/cloakbot/providers/bedrock_provider.py +760 -0
  166. cloakbot-0.2.1b1/cloakbot/providers/detector.py +77 -0
  167. cloakbot-0.2.1b1/cloakbot/providers/factory.py +248 -0
  168. cloakbot-0.2.1b1/cloakbot/providers/fallback_provider.py +273 -0
  169. cloakbot-0.2.1b1/cloakbot/providers/github_copilot_provider.py +261 -0
  170. cloakbot-0.2.1b1/cloakbot/providers/image_generation.py +1603 -0
  171. cloakbot-0.2.1b1/cloakbot/providers/openai_codex_provider.py +321 -0
  172. cloakbot-0.2.1b1/cloakbot/providers/openai_compat_provider.py +1486 -0
  173. cloakbot-0.2.1b1/cloakbot/providers/openai_responses/__init__.py +31 -0
  174. cloakbot-0.2.1b1/cloakbot/providers/openai_responses/converters.py +127 -0
  175. cloakbot-0.2.1b1/cloakbot/providers/openai_responses/parsing.py +424 -0
  176. cloakbot-0.2.1b1/cloakbot/providers/registry.py +533 -0
  177. cloakbot-0.2.1b1/cloakbot/providers/transcription.py +221 -0
  178. cloakbot-0.2.1b1/cloakbot/security/__init__.py +1 -0
  179. cloakbot-0.2.1b1/cloakbot/security/network.py +159 -0
  180. cloakbot-0.2.1b1/cloakbot/security/workspace_access.py +430 -0
  181. cloakbot-0.2.1b1/cloakbot/security/workspace_policy.py +85 -0
  182. cloakbot-0.2.1b1/cloakbot/session/__init__.py +5 -0
  183. cloakbot-0.2.1b1/cloakbot/session/goal_state.py +126 -0
  184. cloakbot-0.2.1b1/cloakbot/session/manager.py +749 -0
  185. cloakbot-0.2.1b1/cloakbot/session/turn_continuation.py +240 -0
  186. cloakbot-0.2.1b1/cloakbot/session/webui_turns.py +449 -0
  187. cloakbot-0.2.1b1/cloakbot/skills/README.md +32 -0
  188. cloakbot-0.2.1b1/cloakbot/skills/clawhub/SKILL.md +53 -0
  189. cloakbot-0.2.1b1/cloakbot/skills/cron/SKILL.md +57 -0
  190. cloakbot-0.2.1b1/cloakbot/skills/github/SKILL.md +48 -0
  191. cloakbot-0.2.1b1/cloakbot/skills/image-generation/SKILL.md +66 -0
  192. cloakbot-0.2.1b1/cloakbot/skills/long-goal/SKILL.md +79 -0
  193. cloakbot-0.2.1b1/cloakbot/skills/memory/SKILL.md +36 -0
  194. cloakbot-0.2.1b1/cloakbot/skills/my/SKILL.md +72 -0
  195. cloakbot-0.2.1b1/cloakbot/skills/my/references/examples.md +75 -0
  196. cloakbot-0.2.1b1/cloakbot/skills/skill-creator/SKILL.md +374 -0
  197. cloakbot-0.2.1b1/cloakbot/skills/skill-creator/scripts/init_skill.py +378 -0
  198. cloakbot-0.2.1b1/cloakbot/skills/skill-creator/scripts/package_skill.py +152 -0
  199. cloakbot-0.2.1b1/cloakbot/skills/skill-creator/scripts/quick_validate.py +213 -0
  200. cloakbot-0.2.1b1/cloakbot/skills/summarize/SKILL.md +67 -0
  201. cloakbot-0.2.1b1/cloakbot/skills/tmux/SKILL.md +121 -0
  202. cloakbot-0.2.1b1/cloakbot/skills/tmux/scripts/find-sessions.sh +112 -0
  203. cloakbot-0.2.1b1/cloakbot/skills/tmux/scripts/wait-for-text.sh +83 -0
  204. cloakbot-0.2.1b1/cloakbot/skills/update-setup/SKILL.md +123 -0
  205. cloakbot-0.2.1b1/cloakbot/skills/weather/SKILL.md +49 -0
  206. cloakbot-0.2.1b1/cloakbot/templates/AGENTS.md +23 -0
  207. cloakbot-0.2.1b1/cloakbot/templates/HEARTBEAT.md +14 -0
  208. cloakbot-0.2.1b1/cloakbot/templates/SOUL.md +20 -0
  209. cloakbot-0.2.1b1/cloakbot/templates/USER.md +49 -0
  210. cloakbot-0.2.1b1/cloakbot/templates/__init__.py +0 -0
  211. cloakbot-0.2.1b1/cloakbot/templates/agent/_snippets/untrusted_content.md +2 -0
  212. cloakbot-0.2.1b1/cloakbot/templates/agent/consolidator_archive.md +24 -0
  213. cloakbot-0.2.1b1/cloakbot/templates/agent/dream.md +105 -0
  214. cloakbot-0.2.1b1/cloakbot/templates/agent/evaluator.md +17 -0
  215. cloakbot-0.2.1b1/cloakbot/templates/agent/identity.md +34 -0
  216. cloakbot-0.2.1b1/cloakbot/templates/agent/max_iterations_message.md +1 -0
  217. cloakbot-0.2.1b1/cloakbot/templates/agent/platform_policy.md +10 -0
  218. cloakbot-0.2.1b1/cloakbot/templates/agent/skills_section.md +6 -0
  219. cloakbot-0.2.1b1/cloakbot/templates/agent/subagent_announce.md +8 -0
  220. cloakbot-0.2.1b1/cloakbot/templates/agent/subagent_system.md +19 -0
  221. cloakbot-0.2.1b1/cloakbot/templates/agent/tool_contract.md +67 -0
  222. cloakbot-0.2.1b1/cloakbot/templates/memory/MEMORY.md +23 -0
  223. cloakbot-0.2.1b1/cloakbot/templates/memory/__init__.py +0 -0
  224. cloakbot-0.2.1b1/cloakbot/tool_privacy.py +9 -0
  225. cloakbot-0.2.1b1/cloakbot/utils/__init__.py +42 -0
  226. cloakbot-0.2.1b1/cloakbot/utils/artifacts.py +122 -0
  227. cloakbot-0.2.1b1/cloakbot/utils/document.py +319 -0
  228. cloakbot-0.2.1b1/cloakbot/utils/evaluator.py +94 -0
  229. cloakbot-0.2.1b1/cloakbot/utils/file_edit_events.py +964 -0
  230. cloakbot-0.2.1b1/cloakbot/utils/gitstore.py +394 -0
  231. cloakbot-0.2.1b1/cloakbot/utils/helpers.py +639 -0
  232. cloakbot-0.2.1b1/cloakbot/utils/image_generation_intent.py +27 -0
  233. cloakbot-0.2.1b1/cloakbot/utils/llm_runtime.py +22 -0
  234. cloakbot-0.2.1b1/cloakbot/utils/logging_bridge.py +47 -0
  235. cloakbot-0.2.1b1/cloakbot/utils/media_decode.py +55 -0
  236. cloakbot-0.2.1b1/cloakbot/utils/path.py +107 -0
  237. cloakbot-0.2.1b1/cloakbot/utils/progress_events.py +101 -0
  238. cloakbot-0.2.1b1/cloakbot/utils/prompt_templates.py +35 -0
  239. cloakbot-0.2.1b1/cloakbot/utils/restart.py +84 -0
  240. cloakbot-0.2.1b1/cloakbot/utils/runtime.py +180 -0
  241. cloakbot-0.2.1b1/cloakbot/utils/searchusage.py +168 -0
  242. cloakbot-0.2.1b1/cloakbot/utils/subagent_channel_display.py +59 -0
  243. cloakbot-0.2.1b1/cloakbot/utils/tool_hints.py +142 -0
  244. cloakbot-0.2.1b1/cloakbot/web/__init__.py +8 -0
  245. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  246. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  247. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  248. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  249. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  250. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  251. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  252. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  253. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  254. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  255. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  256. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  257. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  258. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  259. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  260. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  261. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  262. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  263. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  264. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  265. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  266. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  267. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  268. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  269. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  270. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  271. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  272. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  273. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  274. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  275. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  276. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  277. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  278. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  279. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  280. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  281. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  282. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  283. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  284. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  285. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  286. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  287. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  288. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  289. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  290. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  291. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  292. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  293. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  294. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  295. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  296. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  297. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  298. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  299. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  300. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  301. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  302. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  303. cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  304. cloakbot-0.2.1b1/cloakbot/web/dist/assets/MarkdownTextRenderer-DnRJ3Bsa.js +3 -0
  305. cloakbot-0.2.1b1/cloakbot/web/dist/assets/abap-NUN-Q4TY.js +1 -0
  306. cloakbot-0.2.1b1/cloakbot/web/dist/assets/abnf-D-KJbf1C.js +1 -0
  307. cloakbot-0.2.1b1/cloakbot/web/dist/assets/actionscript-DENL_Yxo.js +1 -0
  308. cloakbot-0.2.1b1/cloakbot/web/dist/assets/ada-LH5SZrhx.js +1 -0
  309. cloakbot-0.2.1b1/cloakbot/web/dist/assets/agda-ymtcdZdX.js +1 -0
  310. cloakbot-0.2.1b1/cloakbot/web/dist/assets/al-CJVAWKDz.js +1 -0
  311. cloakbot-0.2.1b1/cloakbot/web/dist/assets/antlr4-BMELX9Jd.js +1 -0
  312. cloakbot-0.2.1b1/cloakbot/web/dist/assets/apacheconf-BcTIfZ-R.js +1 -0
  313. cloakbot-0.2.1b1/cloakbot/web/dist/assets/apex-DX55Uwde.js +1 -0
  314. cloakbot-0.2.1b1/cloakbot/web/dist/assets/apl-vpZAny-b.js +1 -0
  315. cloakbot-0.2.1b1/cloakbot/web/dist/assets/applescript-CaPaYwG-.js +1 -0
  316. cloakbot-0.2.1b1/cloakbot/web/dist/assets/aql--wTUDf9B.js +1 -0
  317. cloakbot-0.2.1b1/cloakbot/web/dist/assets/arduino-CIKuiMMj.js +1 -0
  318. cloakbot-0.2.1b1/cloakbot/web/dist/assets/arff-BJFPZ3ZQ.js +1 -0
  319. cloakbot-0.2.1b1/cloakbot/web/dist/assets/asciidoc-Dz9LU0oo.js +1 -0
  320. cloakbot-0.2.1b1/cloakbot/web/dist/assets/asm6502-WnqbQVpP.js +1 -0
  321. cloakbot-0.2.1b1/cloakbot/web/dist/assets/asmatmel-5Jy3DrzW.js +1 -0
  322. cloakbot-0.2.1b1/cloakbot/web/dist/assets/aspnet-Bm3yfv9h.js +1 -0
  323. cloakbot-0.2.1b1/cloakbot/web/dist/assets/autohotkey-BeMG6bjj.js +1 -0
  324. cloakbot-0.2.1b1/cloakbot/web/dist/assets/autoit-Dt3Q7KNE.js +1 -0
  325. cloakbot-0.2.1b1/cloakbot/web/dist/assets/avisynth-_25jQ1mu.js +1 -0
  326. cloakbot-0.2.1b1/cloakbot/web/dist/assets/avro-idl-B_qGseSi.js +1 -0
  327. cloakbot-0.2.1b1/cloakbot/web/dist/assets/bash-Cb3UAMlT.js +1 -0
  328. cloakbot-0.2.1b1/cloakbot/web/dist/assets/basic-DgRegGrm.js +1 -0
  329. cloakbot-0.2.1b1/cloakbot/web/dist/assets/batch-DVsfxIac.js +1 -0
  330. cloakbot-0.2.1b1/cloakbot/web/dist/assets/bbcode-CN8dvzDf.js +1 -0
  331. cloakbot-0.2.1b1/cloakbot/web/dist/assets/bicep-CA94bLGb.js +1 -0
  332. cloakbot-0.2.1b1/cloakbot/web/dist/assets/birb-CtQq6iAZ.js +1 -0
  333. cloakbot-0.2.1b1/cloakbot/web/dist/assets/bison-CvtdVC8F.js +1 -0
  334. cloakbot-0.2.1b1/cloakbot/web/dist/assets/bnf-BWGPbtjg.js +1 -0
  335. cloakbot-0.2.1b1/cloakbot/web/dist/assets/brainfuck-Dj0-XgUQ.js +1 -0
  336. cloakbot-0.2.1b1/cloakbot/web/dist/assets/brightscript-B7D0klqQ.js +1 -0
  337. cloakbot-0.2.1b1/cloakbot/web/dist/assets/bro-f49XYRi4.js +1 -0
  338. cloakbot-0.2.1b1/cloakbot/web/dist/assets/bsl-BK1qQL1V.js +1 -0
  339. cloakbot-0.2.1b1/cloakbot/web/dist/assets/c-C0oRItof.js +1 -0
  340. cloakbot-0.2.1b1/cloakbot/web/dist/assets/cfscript-DOeQ7VDG.js +1 -0
  341. cloakbot-0.2.1b1/cloakbot/web/dist/assets/chaiscript-xYGnwzjJ.js +1 -0
  342. cloakbot-0.2.1b1/cloakbot/web/dist/assets/cil-eLAyeTPF.js +1 -0
  343. cloakbot-0.2.1b1/cloakbot/web/dist/assets/clojure-DgK4YDmn.js +1 -0
  344. cloakbot-0.2.1b1/cloakbot/web/dist/assets/cmake-CXLQNC9N.js +1 -0
  345. cloakbot-0.2.1b1/cloakbot/web/dist/assets/cobol-d9-VgeZD.js +1 -0
  346. cloakbot-0.2.1b1/cloakbot/web/dist/assets/coffeescript-C9QjHd1_.js +1 -0
  347. cloakbot-0.2.1b1/cloakbot/web/dist/assets/concurnas-bKB8OwZy.js +1 -0
  348. cloakbot-0.2.1b1/cloakbot/web/dist/assets/coq-CQYQuxb4.js +1 -0
  349. cloakbot-0.2.1b1/cloakbot/web/dist/assets/cpp-e-seuWBm.js +1 -0
  350. cloakbot-0.2.1b1/cloakbot/web/dist/assets/crystal-WWZ_tnQX.js +1 -0
  351. cloakbot-0.2.1b1/cloakbot/web/dist/assets/csharp-rMV9Zfra.js +1 -0
  352. cloakbot-0.2.1b1/cloakbot/web/dist/assets/cshtml-Ds09IOCc.js +1 -0
  353. cloakbot-0.2.1b1/cloakbot/web/dist/assets/csp-CQCQ0ZE3.js +1 -0
  354. cloakbot-0.2.1b1/cloakbot/web/dist/assets/css-extras-CT5A2Izd.js +1 -0
  355. cloakbot-0.2.1b1/cloakbot/web/dist/assets/csv-BgyMrcsA.js +1 -0
  356. cloakbot-0.2.1b1/cloakbot/web/dist/assets/cypher-DmelXpIf.js +1 -0
  357. cloakbot-0.2.1b1/cloakbot/web/dist/assets/d-VWCAEm1r.js +1 -0
  358. cloakbot-0.2.1b1/cloakbot/web/dist/assets/dart-CVJdj0-r.js +1 -0
  359. cloakbot-0.2.1b1/cloakbot/web/dist/assets/dataweave-hJYKzcPT.js +1 -0
  360. cloakbot-0.2.1b1/cloakbot/web/dist/assets/dax-C8SI5LyP.js +1 -0
  361. cloakbot-0.2.1b1/cloakbot/web/dist/assets/dhall-ZlvQUk6z.js +1 -0
  362. cloakbot-0.2.1b1/cloakbot/web/dist/assets/diff-DHVMP9tS.js +3 -0
  363. cloakbot-0.2.1b1/cloakbot/web/dist/assets/django-DcF8LBP-.js +1 -0
  364. cloakbot-0.2.1b1/cloakbot/web/dist/assets/dns-zone-file-WEIFK4Je.js +1 -0
  365. cloakbot-0.2.1b1/cloakbot/web/dist/assets/docker-VhAHakcV.js +1 -0
  366. cloakbot-0.2.1b1/cloakbot/web/dist/assets/dot-CD2DeVqg.js +1 -0
  367. cloakbot-0.2.1b1/cloakbot/web/dist/assets/ebnf-CuzNL4UB.js +1 -0
  368. cloakbot-0.2.1b1/cloakbot/web/dist/assets/editorconfig-D2zjbeHU.js +1 -0
  369. cloakbot-0.2.1b1/cloakbot/web/dist/assets/eiffel-DJ3ShHrF.js +1 -0
  370. cloakbot-0.2.1b1/cloakbot/web/dist/assets/ejs-7-hUFLy_.js +1 -0
  371. cloakbot-0.2.1b1/cloakbot/web/dist/assets/elixir-8xvh5cY_.js +1 -0
  372. cloakbot-0.2.1b1/cloakbot/web/dist/assets/elm-g7erWaDT.js +1 -0
  373. cloakbot-0.2.1b1/cloakbot/web/dist/assets/erb-B7Xt-BiE.js +1 -0
  374. cloakbot-0.2.1b1/cloakbot/web/dist/assets/erlang-DkxI4fpk.js +1 -0
  375. cloakbot-0.2.1b1/cloakbot/web/dist/assets/etlua-C2XEtv8g.js +1 -0
  376. cloakbot-0.2.1b1/cloakbot/web/dist/assets/excel-formula-CZSLAApX.js +1 -0
  377. cloakbot-0.2.1b1/cloakbot/web/dist/assets/factor-BxcDZoGu.js +1 -0
  378. cloakbot-0.2.1b1/cloakbot/web/dist/assets/false-BMVpOwHv.js +1 -0
  379. cloakbot-0.2.1b1/cloakbot/web/dist/assets/firestore-security-rules-BW9MFeh3.js +1 -0
  380. cloakbot-0.2.1b1/cloakbot/web/dist/assets/flow-Dlx8nrOL.js +1 -0
  381. cloakbot-0.2.1b1/cloakbot/web/dist/assets/fortran-7T9UcASY.js +1 -0
  382. cloakbot-0.2.1b1/cloakbot/web/dist/assets/fsharp-BAZLP3r3.js +1 -0
  383. cloakbot-0.2.1b1/cloakbot/web/dist/assets/ftl-Bc_oXPVP.js +1 -0
  384. cloakbot-0.2.1b1/cloakbot/web/dist/assets/gap-8IEH7qXG.js +1 -0
  385. cloakbot-0.2.1b1/cloakbot/web/dist/assets/gcode-CJYFbpnI.js +1 -0
  386. cloakbot-0.2.1b1/cloakbot/web/dist/assets/gdscript-DNzYL7bS.js +1 -0
  387. cloakbot-0.2.1b1/cloakbot/web/dist/assets/gedcom-CBgiY2w3.js +1 -0
  388. cloakbot-0.2.1b1/cloakbot/web/dist/assets/gherkin-B9TyT2N3.js +1 -0
  389. cloakbot-0.2.1b1/cloakbot/web/dist/assets/git-BsZy3BWd.js +1 -0
  390. cloakbot-0.2.1b1/cloakbot/web/dist/assets/glsl-CygM1cI3.js +1 -0
  391. cloakbot-0.2.1b1/cloakbot/web/dist/assets/gml-CEWHfET-.js +1 -0
  392. cloakbot-0.2.1b1/cloakbot/web/dist/assets/gn-DXi3n3PE.js +1 -0
  393. cloakbot-0.2.1b1/cloakbot/web/dist/assets/go-DU1aoKzc.js +1 -0
  394. cloakbot-0.2.1b1/cloakbot/web/dist/assets/go-module-BD-Mc9Hh.js +1 -0
  395. cloakbot-0.2.1b1/cloakbot/web/dist/assets/graphql--kXj6vcL.js +1 -0
  396. cloakbot-0.2.1b1/cloakbot/web/dist/assets/groovy-BLy61_og.js +1 -0
  397. cloakbot-0.2.1b1/cloakbot/web/dist/assets/haml-bPWdMu4i.js +1 -0
  398. cloakbot-0.2.1b1/cloakbot/web/dist/assets/handlebars-BMYf598U.js +1 -0
  399. cloakbot-0.2.1b1/cloakbot/web/dist/assets/haskell-D_VxTFgH.js +1 -0
  400. cloakbot-0.2.1b1/cloakbot/web/dist/assets/haxe-T1jkpIIT.js +1 -0
  401. cloakbot-0.2.1b1/cloakbot/web/dist/assets/hcl-PldULSBb.js +1 -0
  402. cloakbot-0.2.1b1/cloakbot/web/dist/assets/hlsl-CV7R57m6.js +1 -0
  403. cloakbot-0.2.1b1/cloakbot/web/dist/assets/hoon-CPa5nskQ.js +1 -0
  404. cloakbot-0.2.1b1/cloakbot/web/dist/assets/hpkp-DJfAmLW-.js +1 -0
  405. cloakbot-0.2.1b1/cloakbot/web/dist/assets/hsts-CxLYXpVn.js +1 -0
  406. cloakbot-0.2.1b1/cloakbot/web/dist/assets/http-B9Ds3pAZ.js +1 -0
  407. cloakbot-0.2.1b1/cloakbot/web/dist/assets/ichigojam-DVf-cIZC.js +1 -0
  408. cloakbot-0.2.1b1/cloakbot/web/dist/assets/icon-KWhYca5l.js +1 -0
  409. cloakbot-0.2.1b1/cloakbot/web/dist/assets/icu-message-format-C2lK5p-4.js +1 -0
  410. cloakbot-0.2.1b1/cloakbot/web/dist/assets/idris-BaY-k4HK.js +1 -0
  411. cloakbot-0.2.1b1/cloakbot/web/dist/assets/iecst-CxsHsf9f.js +1 -0
  412. cloakbot-0.2.1b1/cloakbot/web/dist/assets/ignore-DS80tY1X.js +1 -0
  413. cloakbot-0.2.1b1/cloakbot/web/dist/assets/imageEncode.worker-Cs1P3eq4.js +1 -0
  414. cloakbot-0.2.1b1/cloakbot/web/dist/assets/index-BPAapRgI.css +1 -0
  415. cloakbot-0.2.1b1/cloakbot/web/dist/assets/index-XC7Tun-1.js +512 -0
  416. cloakbot-0.2.1b1/cloakbot/web/dist/assets/inform7-Bq6ivJ_x.js +1 -0
  417. cloakbot-0.2.1b1/cloakbot/web/dist/assets/ini-ClDuxIIn.js +1 -0
  418. cloakbot-0.2.1b1/cloakbot/web/dist/assets/io-DMsvaBXO.js +1 -0
  419. cloakbot-0.2.1b1/cloakbot/web/dist/assets/j-1EMBPPgy.js +1 -0
  420. cloakbot-0.2.1b1/cloakbot/web/dist/assets/java-CewVao_H.js +1 -0
  421. cloakbot-0.2.1b1/cloakbot/web/dist/assets/javadoc-BMhUUrn0.js +1 -0
  422. cloakbot-0.2.1b1/cloakbot/web/dist/assets/javadoclike-DRcXw2x4.js +1 -0
  423. cloakbot-0.2.1b1/cloakbot/web/dist/assets/javastacktrace-cVgCwZsl.js +1 -0
  424. cloakbot-0.2.1b1/cloakbot/web/dist/assets/jexl-Cgr1JdcY.js +1 -0
  425. cloakbot-0.2.1b1/cloakbot/web/dist/assets/jolie-BsErGqHn.js +1 -0
  426. cloakbot-0.2.1b1/cloakbot/web/dist/assets/jq-BNzJiU3y.js +1 -0
  427. cloakbot-0.2.1b1/cloakbot/web/dist/assets/js-extras-Cle0v0Ni.js +1 -0
  428. cloakbot-0.2.1b1/cloakbot/web/dist/assets/js-templates-CRt74qtT.js +1 -0
  429. cloakbot-0.2.1b1/cloakbot/web/dist/assets/jsdoc-BqDpEoCE.js +1 -0
  430. cloakbot-0.2.1b1/cloakbot/web/dist/assets/json-C3Hv7pLs.js +1 -0
  431. cloakbot-0.2.1b1/cloakbot/web/dist/assets/json5-CgWTKuX0.js +1 -0
  432. cloakbot-0.2.1b1/cloakbot/web/dist/assets/jsonp-CF0DaYMl.js +1 -0
  433. cloakbot-0.2.1b1/cloakbot/web/dist/assets/jsstacktrace-DdTwpwd9.js +1 -0
  434. cloakbot-0.2.1b1/cloakbot/web/dist/assets/jsx-B2UQKFdi.js +1 -0
  435. cloakbot-0.2.1b1/cloakbot/web/dist/assets/julia-C9A4S2mY.js +1 -0
  436. cloakbot-0.2.1b1/cloakbot/web/dist/assets/katex-BSBacQyE.js +257 -0
  437. cloakbot-0.2.1b1/cloakbot/web/dist/assets/katex-wklAmtGL.css +1 -0
  438. cloakbot-0.2.1b1/cloakbot/web/dist/assets/keepalived-Bh4xvA_q.js +1 -0
  439. cloakbot-0.2.1b1/cloakbot/web/dist/assets/keyman-CNquq_6a.js +1 -0
  440. cloakbot-0.2.1b1/cloakbot/web/dist/assets/kotlin-Bdxl62Ap.js +1 -0
  441. cloakbot-0.2.1b1/cloakbot/web/dist/assets/kumir-CF1O59OV.js +1 -0
  442. cloakbot-0.2.1b1/cloakbot/web/dist/assets/kusto-CK-1V38p.js +1 -0
  443. cloakbot-0.2.1b1/cloakbot/web/dist/assets/latex-361E6eEC.js +1 -0
  444. cloakbot-0.2.1b1/cloakbot/web/dist/assets/latte-f86JSuho.js +1 -0
  445. cloakbot-0.2.1b1/cloakbot/web/dist/assets/less-Bi1_JqPO.js +1 -0
  446. cloakbot-0.2.1b1/cloakbot/web/dist/assets/lilypond-Cq-mKIqY.js +1 -0
  447. cloakbot-0.2.1b1/cloakbot/web/dist/assets/liquid-B4N2kZ3H.js +1 -0
  448. cloakbot-0.2.1b1/cloakbot/web/dist/assets/lisp-CW0qmQGp.js +1 -0
  449. cloakbot-0.2.1b1/cloakbot/web/dist/assets/livescript-D5FtAXwI.js +1 -0
  450. cloakbot-0.2.1b1/cloakbot/web/dist/assets/llvm-BV8wK6xF.js +1 -0
  451. cloakbot-0.2.1b1/cloakbot/web/dist/assets/log-D0hODZpk.js +1 -0
  452. cloakbot-0.2.1b1/cloakbot/web/dist/assets/lolcode-DHoRD95d.js +1 -0
  453. cloakbot-0.2.1b1/cloakbot/web/dist/assets/lua-CVi-soTA.js +1 -0
  454. cloakbot-0.2.1b1/cloakbot/web/dist/assets/magma-DvCCEyFl.js +1 -0
  455. cloakbot-0.2.1b1/cloakbot/web/dist/assets/makefile-BmIUjdPy.js +1 -0
  456. cloakbot-0.2.1b1/cloakbot/web/dist/assets/markdown-CE05kUpP.js +1 -0
  457. cloakbot-0.2.1b1/cloakbot/web/dist/assets/markdown-vendor-CHxCoe4r.js +51 -0
  458. cloakbot-0.2.1b1/cloakbot/web/dist/assets/markup-templating-DPnNaIIy.js +1 -0
  459. cloakbot-0.2.1b1/cloakbot/web/dist/assets/matlab-CscqyiC9.js +1 -0
  460. cloakbot-0.2.1b1/cloakbot/web/dist/assets/maxscript-CZ-oezbY.js +1 -0
  461. cloakbot-0.2.1b1/cloakbot/web/dist/assets/mel-Clp_NDCE.js +1 -0
  462. cloakbot-0.2.1b1/cloakbot/web/dist/assets/mermaid-DhQ9DOjk.js +1 -0
  463. cloakbot-0.2.1b1/cloakbot/web/dist/assets/mizar-CN0VJgC_.js +1 -0
  464. cloakbot-0.2.1b1/cloakbot/web/dist/assets/mongodb-C-4jspnJ.js +1 -0
  465. cloakbot-0.2.1b1/cloakbot/web/dist/assets/monkey-Dfc36AaJ.js +1 -0
  466. cloakbot-0.2.1b1/cloakbot/web/dist/assets/moonscript-DyASHGVA.js +1 -0
  467. cloakbot-0.2.1b1/cloakbot/web/dist/assets/n1ql-DxWPGEgd.js +1 -0
  468. cloakbot-0.2.1b1/cloakbot/web/dist/assets/n4js-CGSDOjR6.js +1 -0
  469. cloakbot-0.2.1b1/cloakbot/web/dist/assets/nand2tetris-hdl-CkGLHgHj.js +1 -0
  470. cloakbot-0.2.1b1/cloakbot/web/dist/assets/naniscript-ChIN67Bw.js +1 -0
  471. cloakbot-0.2.1b1/cloakbot/web/dist/assets/nasm-Bnt6aatk.js +1 -0
  472. cloakbot-0.2.1b1/cloakbot/web/dist/assets/neon-DECLa7BN.js +1 -0
  473. cloakbot-0.2.1b1/cloakbot/web/dist/assets/nevod-2fxCQtPo.js +1 -0
  474. cloakbot-0.2.1b1/cloakbot/web/dist/assets/nginx-CoGjQsmn.js +1 -0
  475. cloakbot-0.2.1b1/cloakbot/web/dist/assets/nim-BMpCszPC.js +1 -0
  476. cloakbot-0.2.1b1/cloakbot/web/dist/assets/nix-D_mQv5VI.js +1 -0
  477. cloakbot-0.2.1b1/cloakbot/web/dist/assets/nsis-BaqSa3Wz.js +1 -0
  478. cloakbot-0.2.1b1/cloakbot/web/dist/assets/objectivec-Dzemz2ja.js +1 -0
  479. cloakbot-0.2.1b1/cloakbot/web/dist/assets/ocaml-CNLwgV-_.js +1 -0
  480. cloakbot-0.2.1b1/cloakbot/web/dist/assets/opencl-DzvSb6Hj.js +1 -0
  481. cloakbot-0.2.1b1/cloakbot/web/dist/assets/openqasm-C4qCMzOe.js +1 -0
  482. cloakbot-0.2.1b1/cloakbot/web/dist/assets/oz-behEqsCQ.js +1 -0
  483. cloakbot-0.2.1b1/cloakbot/web/dist/assets/parigp-Ch6SZvgk.js +1 -0
  484. cloakbot-0.2.1b1/cloakbot/web/dist/assets/parser-BtGxkDWV.js +1 -0
  485. cloakbot-0.2.1b1/cloakbot/web/dist/assets/pascal-CmTgy_1Z.js +1 -0
  486. cloakbot-0.2.1b1/cloakbot/web/dist/assets/pascaligo-BXmCbm9G.js +1 -0
  487. cloakbot-0.2.1b1/cloakbot/web/dist/assets/pcaxis-DzyFSRg_.js +1 -0
  488. cloakbot-0.2.1b1/cloakbot/web/dist/assets/peoplecode-B0FPTfca.js +1 -0
  489. cloakbot-0.2.1b1/cloakbot/web/dist/assets/perl-VmqMidup.js +1 -0
  490. cloakbot-0.2.1b1/cloakbot/web/dist/assets/php-WU4kuGhf.js +1 -0
  491. cloakbot-0.2.1b1/cloakbot/web/dist/assets/php-extras-DipLCQnj.js +1 -0
  492. cloakbot-0.2.1b1/cloakbot/web/dist/assets/phpdoc-CUDU7T8Q.js +1 -0
  493. cloakbot-0.2.1b1/cloakbot/web/dist/assets/plsql-DGyiSrqR.js +1 -0
  494. cloakbot-0.2.1b1/cloakbot/web/dist/assets/powerquery-B7U3Mrpn.js +1 -0
  495. cloakbot-0.2.1b1/cloakbot/web/dist/assets/powershell-ZbXZQOaZ.js +1 -0
  496. cloakbot-0.2.1b1/cloakbot/web/dist/assets/processing-ByQRo6i7.js +1 -0
  497. cloakbot-0.2.1b1/cloakbot/web/dist/assets/prolog-BOvhxG3V.js +1 -0
  498. cloakbot-0.2.1b1/cloakbot/web/dist/assets/promql-C2CobPDE.js +1 -0
  499. cloakbot-0.2.1b1/cloakbot/web/dist/assets/properties-CwSf9g07.js +1 -0
  500. cloakbot-0.2.1b1/cloakbot/web/dist/assets/protobuf-B57RIxkn.js +1 -0
  501. cloakbot-0.2.1b1/cloakbot/web/dist/assets/psl-DzFyTHe1.js +1 -0
  502. cloakbot-0.2.1b1/cloakbot/web/dist/assets/pug-BH1QhRaq.js +1 -0
  503. cloakbot-0.2.1b1/cloakbot/web/dist/assets/puppet-Bs9vzkUe.js +1 -0
  504. cloakbot-0.2.1b1/cloakbot/web/dist/assets/pure-BdX0RpFB.js +1 -0
  505. cloakbot-0.2.1b1/cloakbot/web/dist/assets/purebasic-BQU22L1L.js +1 -0
  506. cloakbot-0.2.1b1/cloakbot/web/dist/assets/purescript-BagkDTwF.js +1 -0
  507. cloakbot-0.2.1b1/cloakbot/web/dist/assets/python-RwSVHJ9V.js +1 -0
  508. cloakbot-0.2.1b1/cloakbot/web/dist/assets/q-BET3zqr2.js +1 -0
  509. cloakbot-0.2.1b1/cloakbot/web/dist/assets/qml-CoQTBiQ8.js +1 -0
  510. cloakbot-0.2.1b1/cloakbot/web/dist/assets/qore-CLDloqZD.js +1 -0
  511. cloakbot-0.2.1b1/cloakbot/web/dist/assets/qsharp-CDXKQeBv.js +1 -0
  512. cloakbot-0.2.1b1/cloakbot/web/dist/assets/r-BgAHHb-4.js +1 -0
  513. cloakbot-0.2.1b1/cloakbot/web/dist/assets/racket-CZmbqa8w.js +1 -0
  514. cloakbot-0.2.1b1/cloakbot/web/dist/assets/reason-D0_MaL5W.js +1 -0
  515. cloakbot-0.2.1b1/cloakbot/web/dist/assets/regex-QM-tU3X2.js +1 -0
  516. cloakbot-0.2.1b1/cloakbot/web/dist/assets/rego-DjXu5pFv.js +1 -0
  517. cloakbot-0.2.1b1/cloakbot/web/dist/assets/renpy-hG_ow2kX.js +1 -0
  518. cloakbot-0.2.1b1/cloakbot/web/dist/assets/rest-ub8bBn-k.js +1 -0
  519. cloakbot-0.2.1b1/cloakbot/web/dist/assets/rip-DR0ywRNu.js +1 -0
  520. cloakbot-0.2.1b1/cloakbot/web/dist/assets/roboconf-B0rb3xgX.js +1 -0
  521. cloakbot-0.2.1b1/cloakbot/web/dist/assets/robotframework-BUno3CtF.js +1 -0
  522. cloakbot-0.2.1b1/cloakbot/web/dist/assets/ruby-Brn8fnNm.js +1 -0
  523. cloakbot-0.2.1b1/cloakbot/web/dist/assets/rust-Ck_uMGfC.js +1 -0
  524. cloakbot-0.2.1b1/cloakbot/web/dist/assets/sas-DSvGfcUx.js +1 -0
  525. cloakbot-0.2.1b1/cloakbot/web/dist/assets/sass-iA6MSihr.js +1 -0
  526. cloakbot-0.2.1b1/cloakbot/web/dist/assets/scala-EEfoM1jv.js +1 -0
  527. cloakbot-0.2.1b1/cloakbot/web/dist/assets/scheme-BBqT4W3K.js +1 -0
  528. cloakbot-0.2.1b1/cloakbot/web/dist/assets/scss-EDX5cncP.js +1 -0
  529. cloakbot-0.2.1b1/cloakbot/web/dist/assets/shell-session-CJFdfejh.js +1 -0
  530. cloakbot-0.2.1b1/cloakbot/web/dist/assets/smali-Bm6qyqwX.js +1 -0
  531. cloakbot-0.2.1b1/cloakbot/web/dist/assets/smalltalk-BHlu5omn.js +1 -0
  532. cloakbot-0.2.1b1/cloakbot/web/dist/assets/smarty-CTN6tCig.js +1 -0
  533. cloakbot-0.2.1b1/cloakbot/web/dist/assets/sml-DkSEEtgE.js +1 -0
  534. cloakbot-0.2.1b1/cloakbot/web/dist/assets/solidity-DbbwU6KF.js +1 -0
  535. cloakbot-0.2.1b1/cloakbot/web/dist/assets/solution-file-DjIYncCO.js +1 -0
  536. cloakbot-0.2.1b1/cloakbot/web/dist/assets/soy-D4HHWo9i.js +1 -0
  537. cloakbot-0.2.1b1/cloakbot/web/dist/assets/sparql-CsVa7hte.js +1 -0
  538. cloakbot-0.2.1b1/cloakbot/web/dist/assets/splunk-spl-BjJg2Exp.js +1 -0
  539. cloakbot-0.2.1b1/cloakbot/web/dist/assets/sqf-9Xk-yGkV.js +1 -0
  540. cloakbot-0.2.1b1/cloakbot/web/dist/assets/sql-YBattGiR.js +1 -0
  541. cloakbot-0.2.1b1/cloakbot/web/dist/assets/squirrel-BrO73Frc.js +1 -0
  542. cloakbot-0.2.1b1/cloakbot/web/dist/assets/stan-Bp1R52Lx.js +1 -0
  543. cloakbot-0.2.1b1/cloakbot/web/dist/assets/stylus-CYuOuTL2.js +1 -0
  544. cloakbot-0.2.1b1/cloakbot/web/dist/assets/swift-xHzlmVoR.js +1 -0
  545. cloakbot-0.2.1b1/cloakbot/web/dist/assets/syntax-highlight-DCgzSdVd.js +14 -0
  546. cloakbot-0.2.1b1/cloakbot/web/dist/assets/systemd-q770erU6.js +2 -0
  547. cloakbot-0.2.1b1/cloakbot/web/dist/assets/t4-cs-C5O5jKQ-.js +1 -0
  548. cloakbot-0.2.1b1/cloakbot/web/dist/assets/t4-templating-DSbTm9R0.js +1 -0
  549. cloakbot-0.2.1b1/cloakbot/web/dist/assets/t4-vb-D-3ClfEW.js +1 -0
  550. cloakbot-0.2.1b1/cloakbot/web/dist/assets/tap-CDX0b6dR.js +1 -0
  551. cloakbot-0.2.1b1/cloakbot/web/dist/assets/tcl-DN1Ucqga.js +1 -0
  552. cloakbot-0.2.1b1/cloakbot/web/dist/assets/textile-DLoqze5H.js +1 -0
  553. cloakbot-0.2.1b1/cloakbot/web/dist/assets/toml-BeKaK4mH.js +1 -0
  554. cloakbot-0.2.1b1/cloakbot/web/dist/assets/tremor-CEa3FcAW.js +1 -0
  555. cloakbot-0.2.1b1/cloakbot/web/dist/assets/tsx-pwqpn4KT.js +1 -0
  556. cloakbot-0.2.1b1/cloakbot/web/dist/assets/tt2-Cl1RsxSw.js +1 -0
  557. cloakbot-0.2.1b1/cloakbot/web/dist/assets/turtle-DZqESLx2.js +1 -0
  558. cloakbot-0.2.1b1/cloakbot/web/dist/assets/twig-R1TH6YUG.js +1 -0
  559. cloakbot-0.2.1b1/cloakbot/web/dist/assets/typescript-CsCgqoRI.js +1 -0
  560. cloakbot-0.2.1b1/cloakbot/web/dist/assets/typoscript-BVuqnMDP.js +1 -0
  561. cloakbot-0.2.1b1/cloakbot/web/dist/assets/unrealscript-Am1hcp0G.js +1 -0
  562. cloakbot-0.2.1b1/cloakbot/web/dist/assets/uorazor-C9OiWvz8.js +1 -0
  563. cloakbot-0.2.1b1/cloakbot/web/dist/assets/uri-MwZhKeWh.js +1 -0
  564. cloakbot-0.2.1b1/cloakbot/web/dist/assets/v-CIC4n_ke.js +1 -0
  565. cloakbot-0.2.1b1/cloakbot/web/dist/assets/vala-DO5cmjce.js +1 -0
  566. cloakbot-0.2.1b1/cloakbot/web/dist/assets/vbnet-CJjFEgIg.js +1 -0
  567. cloakbot-0.2.1b1/cloakbot/web/dist/assets/velocity-cr2eidoW.js +1 -0
  568. cloakbot-0.2.1b1/cloakbot/web/dist/assets/verilog-C_HsAsqe.js +1 -0
  569. cloakbot-0.2.1b1/cloakbot/web/dist/assets/vhdl-BwBD3DKL.js +1 -0
  570. cloakbot-0.2.1b1/cloakbot/web/dist/assets/vim-Dqw9xkI1.js +1 -0
  571. cloakbot-0.2.1b1/cloakbot/web/dist/assets/visual-basic-DqvyCv2_.js +1 -0
  572. cloakbot-0.2.1b1/cloakbot/web/dist/assets/warpscript-DJL-COd1.js +1 -0
  573. cloakbot-0.2.1b1/cloakbot/web/dist/assets/wasm-KvauVSwO.js +1 -0
  574. cloakbot-0.2.1b1/cloakbot/web/dist/assets/web-idl-BxYvb2Gb.js +1 -0
  575. cloakbot-0.2.1b1/cloakbot/web/dist/assets/wiki-BHXLza-L.js +1 -0
  576. cloakbot-0.2.1b1/cloakbot/web/dist/assets/wolfram-kAMBUx9a.js +1 -0
  577. cloakbot-0.2.1b1/cloakbot/web/dist/assets/wren-Crw12_Hv.js +1 -0
  578. cloakbot-0.2.1b1/cloakbot/web/dist/assets/xeora-CWky1D6u.js +1 -0
  579. cloakbot-0.2.1b1/cloakbot/web/dist/assets/xml-doc-D1sLufgd.js +1 -0
  580. cloakbot-0.2.1b1/cloakbot/web/dist/assets/xojo-DZgGZigC.js +1 -0
  581. cloakbot-0.2.1b1/cloakbot/web/dist/assets/xquery-Dg59bIp5.js +1 -0
  582. cloakbot-0.2.1b1/cloakbot/web/dist/assets/yaml-C-mPAAtt.js +1 -0
  583. cloakbot-0.2.1b1/cloakbot/web/dist/assets/yang-B16K-lne.js +1 -0
  584. cloakbot-0.2.1b1/cloakbot/web/dist/assets/zig-DOLkVX_D.js +1 -0
  585. cloakbot-0.2.1b1/cloakbot/web/dist/brand/cloakbot_apple_touch.png +0 -0
  586. cloakbot-0.2.1b1/cloakbot/web/dist/brand/cloakbot_favicon_32.png +0 -0
  587. cloakbot-0.2.1b1/cloakbot/web/dist/brand/cloakbot_icon.png +0 -0
  588. cloakbot-0.2.1b1/cloakbot/web/dist/brand/cloakbot_logo.png +0 -0
  589. cloakbot-0.2.1b1/cloakbot/web/dist/index.html +191 -0
  590. cloakbot-0.2.1b1/cloakbot/webui/__init__.py +2 -0
  591. cloakbot-0.2.1b1/cloakbot/webui/cli_apps_api.py +93 -0
  592. cloakbot-0.2.1b1/cloakbot/webui/gateway_services.py +70 -0
  593. cloakbot-0.2.1b1/cloakbot/webui/gateway_tokens.py +82 -0
  594. cloakbot-0.2.1b1/cloakbot/webui/http_utils.py +151 -0
  595. cloakbot-0.2.1b1/cloakbot/webui/mcp_presets_api.py +1318 -0
  596. cloakbot-0.2.1b1/cloakbot/webui/mcp_presets_runtime.py +5 -0
  597. cloakbot-0.2.1b1/cloakbot/webui/media_api.py +284 -0
  598. cloakbot-0.2.1b1/cloakbot/webui/media_gateway.py +92 -0
  599. cloakbot-0.2.1b1/cloakbot/webui/privacy_routes.py +79 -0
  600. cloakbot-0.2.1b1/cloakbot/webui/settings_api.py +1446 -0
  601. cloakbot-0.2.1b1/cloakbot/webui/settings_routes.py +356 -0
  602. cloakbot-0.2.1b1/cloakbot/webui/sidebar_state.py +196 -0
  603. cloakbot-0.2.1b1/cloakbot/webui/thread_disk.py +31 -0
  604. cloakbot-0.2.1b1/cloakbot/webui/transcript.py +922 -0
  605. cloakbot-0.2.1b1/cloakbot/webui/websocket_logging.py +45 -0
  606. cloakbot-0.2.1b1/cloakbot/webui/workspaces.py +283 -0
  607. cloakbot-0.2.1b1/cloakbot/webui/ws_http.py +513 -0
  608. cloakbot-0.2.1b1/docs/README.md +35 -0
  609. cloakbot-0.2.1b1/docs/exec-plans/README.md +40 -0
  610. cloakbot-0.2.1b1/pyproject.toml +209 -0
  611. cloakbot-0.2.1b1/tests/eval/README.md +97 -0
@@ -0,0 +1,57 @@
1
+ # .gitignore — paths kept out of the repo, grouped by concern.
2
+ # See .dockerignore for the image-build equivalent. Runtime config lives in
3
+ # ~/.cloakbot/config.json (cloakbot onboard / WebUI Settings), not in .env.
4
+
5
+ # ── Secrets & local config ──────────────────────────────────────────────────
6
+ .env
7
+
8
+ # ── Python artifacts ────────────────────────────────────────────────────────
9
+ __pycache__/
10
+ *.py[cod]
11
+ *.egg
12
+ *.egg-info/
13
+ dist/
14
+ build/
15
+ .pytest_cache/
16
+
17
+ # ── Virtual environments & lockfiles ────────────────────────────────────────
18
+ .venv/
19
+ venv/
20
+ poetry.lock
21
+ uv.lock
22
+
23
+ # ── Editor / OS / misc cruft ────────────────────────────────────────────────
24
+ .vscode/
25
+ .DS_Store
26
+ nano.*.save
27
+ botpy.log
28
+ MagicMock/
29
+
30
+ # ── Agent & assistant local state ───────────────────────────────────────────
31
+ .claude
32
+ .omc/
33
+ .worktrees/
34
+
35
+ # ── Local scratch dirs (shadow real ones; keep out of the repo) ─────────────
36
+ .assets
37
+ .docs
38
+ .web
39
+
40
+ # ── Node (WhatsApp bridge) ──────────────────────────────────────────────────
41
+ bridge/node_modules/
42
+
43
+ # ── Local model downloads (can be large) ────────────────────────────────────
44
+ models/
45
+ *.gguf
46
+ vllm_server.log
47
+
48
+ # ── Eval datasets (generated locally) ───────────────────────────────────────
49
+ datasets/
50
+ evals/
51
+
52
+ # ── Local privacy data — may contain real PII; never commit ─────────────────
53
+ # Test fixtures, sanitizer session maps, vault snapshots, and session traces.
54
+ gamma4-image-test/
55
+ ~/.cloakbot/sanitizer_maps/
56
+ privacy_vault/
57
+ sessions/
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) CloakBot Contributors
4
+ Portions copyright (c) HKUDS — nanobot (https://github.com/HKUDS/nanobot)
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE
@@ -0,0 +1,371 @@
1
+ Metadata-Version: 2.4
2
+ Name: cloakbot
3
+ Version: 0.2.1b1
4
+ Summary: Local privacy kernel for frontier LLMs — Gemma 4 E2B detects, redacts, and restores PII before any byte crosses the wire.
5
+ Author: CloakBot contributors
6
+ Author-email: Laurie Luo <me@laurie.pro>
7
+ License: MIT
8
+ License-File: LICENSE
9
+ Keywords: agent,gemma,gemma-4,llm,local-first,ollama,pii,privacy,redaction,safety,sanitization,trust,vllm
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Intended Audience :: Information Technology
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: MacOS
15
+ Classifier: Operating System :: POSIX :: Linux
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
20
+ Classifier: Topic :: Security
21
+ Requires-Python: >=3.11
22
+ Requires-Dist: anthropic<1.0.0,>=0.45.0
23
+ Requires-Dist: boto3>=1.43.0
24
+ Requires-Dist: chardet<6.0.0,>=3.0.2
25
+ Requires-Dist: croniter<7.0.0,>=6.0.0
26
+ Requires-Dist: ddgs<10.0.0,>=9.5.5
27
+ Requires-Dist: dingtalk-stream<1.0.0,>=0.24.0
28
+ Requires-Dist: dulwich<1.0.0,>=0.22.0
29
+ Requires-Dist: fastapi<1.0.0,>=0.115.0
30
+ Requires-Dist: filelock>=3.25.2
31
+ Requires-Dist: httpx<1.0.0,>=0.28.0
32
+ Requires-Dist: jinja2<4.0.0,>=3.1.0
33
+ Requires-Dist: json-repair<1.0.0,>=0.57.0
34
+ Requires-Dist: lark-oapi<2.0.0,>=1.5.0
35
+ Requires-Dist: loguru<1.0.0,>=0.7.3
36
+ Requires-Dist: mcp<2.0.0,>=1.26.0
37
+ Requires-Dist: msgpack<2.0.0,>=1.1.0
38
+ Requires-Dist: oauth-cli-kit<1.0.0,>=0.1.3
39
+ Requires-Dist: openai>=2.8.0
40
+ Requires-Dist: openpyxl<4.0.0,>=3.1.0
41
+ Requires-Dist: pillow>=12.0.0
42
+ Requires-Dist: prompt-toolkit<4.0.0,>=3.0.50
43
+ Requires-Dist: pydantic-settings<3.0.0,>=2.12.0
44
+ Requires-Dist: pydantic<3.0.0,>=2.12.0
45
+ Requires-Dist: pymupdf>=1.27.0
46
+ Requires-Dist: pypdf<6.0.0,>=5.0.0
47
+ Requires-Dist: pytesseract>=0.3.13
48
+ Requires-Dist: python-docx<2.0.0,>=1.1.0
49
+ Requires-Dist: python-pptx<2.0.0,>=1.0.0
50
+ Requires-Dist: python-socketio<6.0.0,>=5.16.0
51
+ Requires-Dist: python-socks[asyncio]<3.0.0,>=2.8.0
52
+ Requires-Dist: python-telegram-bot[socks,webhooks]<23.0,>=22.6
53
+ Requires-Dist: pyyaml<7.0.0,>=6.0
54
+ Requires-Dist: qq-botpy<2.0.0,>=1.2.0
55
+ Requires-Dist: questionary<3.0.0,>=2.0.0
56
+ Requires-Dist: readability-lxml<1.0.0,>=0.8.4
57
+ Requires-Dist: rich<15.0.0,>=14.0.0
58
+ Requires-Dist: slack-sdk<4.0.0,>=3.39.0
59
+ Requires-Dist: slackify-markdown<1.0.0,>=0.2.0
60
+ Requires-Dist: socksio<2.0.0,>=1.0.0
61
+ Requires-Dist: tiktoken<1.0.0,>=0.12.0
62
+ Requires-Dist: typer<1.0.0,>=0.20.0
63
+ Requires-Dist: websocket-client<2.0.0,>=1.9.0
64
+ Requires-Dist: websockets<17.0,>=16.0
65
+ Provides-Extra: api
66
+ Requires-Dist: aiohttp<4.0.0,>=3.9.0; extra == 'api'
67
+ Provides-Extra: dev
68
+ Requires-Dist: aiohttp<4.0.0,>=3.9.0; extra == 'dev'
69
+ Requires-Dist: pytest-asyncio<2.0.0,>=1.3.0; extra == 'dev'
70
+ Requires-Dist: pytest-cov<7.0.0,>=6.0.0; extra == 'dev'
71
+ Requires-Dist: pytest<10.0.0,>=9.0.0; extra == 'dev'
72
+ Requires-Dist: ruff>=0.1.0; extra == 'dev'
73
+ Provides-Extra: discord
74
+ Requires-Dist: discord-py<3.0.0,>=2.5.2; extra == 'discord'
75
+ Provides-Extra: eval
76
+ Requires-Dist: faker>=30.0.0; extra == 'eval'
77
+ Requires-Dist: pyyaml>=6.0.0; extra == 'eval'
78
+ Provides-Extra: langsmith
79
+ Requires-Dist: langsmith>=0.1.0; extra == 'langsmith'
80
+ Provides-Extra: matrix
81
+ Requires-Dist: matrix-nio[e2e]>=0.25.2; extra == 'matrix'
82
+ Requires-Dist: mistune<4.0.0,>=3.0.0; extra == 'matrix'
83
+ Requires-Dist: nh3<1.0.0,>=0.2.17; extra == 'matrix'
84
+ Provides-Extra: msteams
85
+ Requires-Dist: cryptography>=41.0; extra == 'msteams'
86
+ Requires-Dist: pyjwt<3.0,>=2.0; extra == 'msteams'
87
+ Provides-Extra: vllm
88
+ Requires-Dist: transformers==5.5.0; extra == 'vllm'
89
+ Requires-Dist: vllm>=0.8.0; extra == 'vllm'
90
+ Provides-Extra: wecom
91
+ Requires-Dist: wecom-aibot-sdk-python>=0.1.5; extra == 'wecom'
92
+ Provides-Extra: weixin
93
+ Requires-Dist: pycryptodome>=3.20.0; extra == 'weixin'
94
+ Requires-Dist: qrcode[pil]>=8.0; extra == 'weixin'
95
+ Description-Content-Type: text/markdown
96
+
97
+ <p align="center">
98
+ <img src=".github/assets/cloakbot-logo.png" alt="CloakBot" width="420" />
99
+ </p>
100
+
101
+ <h1 align="center">CloakBot — A Local Privacy Kernel for Frontier LLMs</h1>
102
+
103
+ <p align="center">Use Claude / GPT / Gemini without your data ever leaving your laptop.</p>
104
+
105
+ <p align="center">
106
+ <img src="https://img.shields.io/badge/Privacy-Pre--wire%20Enforcement-0F172A?style=flat-square" alt="Pre-wire Enforcement" />
107
+ <img src="https://img.shields.io/badge/Gemma%204-Local%20Trust%20Layer-0F9D58?style=flat-square" alt="Gemma 4 Trust Layer" />
108
+ <img src="https://img.shields.io/badge/Remote%20LLM-Claude%20%7C%20GPT%20%7C%20Gemini-8B5CF6?style=flat-square" alt="Remote LLM Claude GPT Gemini" />
109
+ <img src="https://img.shields.io/badge/Python-3.11%2B-3776AB?style=flat-square" alt="Python 3.11+" />
110
+ <img src="https://img.shields.io/badge/License-MIT-16A34A?style=flat-square" alt="MIT License" />
111
+ </p>
112
+
113
+ <p align="center"><strong>English</strong> | <a href="README.zh-CN.md">简体中文</a></p>
114
+
115
+ <p align="center"><sub>Built on <a href="https://github.com/HKUDS/nanobot">nanobot</a> · Submitted to the <strong>Gemma 4 Good Hackathon</strong> (Kaggle, May 2026)</sub></p>
116
+
117
+ ---
118
+
119
+ ## 📋 TL;DR
120
+
121
+ Frontier LLM use is now load-bearing — but the data that crosses the wire is non-revocable. CloakBot moves enforcement **before the wire**: a local privacy kernel on **Gemma 4 E2B** that detects sensitive spans, assigns stable typed placeholders, redacts images, chunks long documents, and restores outputs locally from a per-session vault. The remote LLM is interchangeable — Claude, GPT, and Gemini all accept the sanitised stream unchanged.
122
+
123
+ > **2,872 entity-test instances of receipts** across three leak-eval layers — `7.98%` pair leak (text) · `1.11%` span leak (visual) · `6.26%` pair leak (long-document) · `97.14%` cross-turn alias consistency.
124
+
125
+ ---
126
+
127
+ ## 🔍 How it works
128
+
129
+ ```
130
+ User message (text + optional images / documents)
131
+ └─► [ pre_llm_hook → PrivacyRuntime ]
132
+ • Local Gemma 4 E2B detectors run concurrently (general + digit)
133
+ • Images → OCR + visual bbox redaction + placeholder overlay
134
+ • Long documents → content-aware chunker + per-chunk detection + vault coalesce
135
+ • Tool I/O → severity-gated approval for non-local tools
136
+ • Sensitive spans rewritten into <<TYPE_N>> placeholders, stored in the per-session Vault
137
+ └─► [ Remote LLM ] (Claude / GPT / Gemini — sanitised payload only)
138
+ • Math turns: remote model emits <python_snippet_N>; real arithmetic happens locally
139
+ • Tool calls: arguments restored locally, outputs re-sanitised before reuse
140
+ └─► [ post_llm_hook → local restoration ]
141
+ • Placeholder restoration via vault map
142
+ • Per-turn transparency report
143
+ └─► User sees original values in the final reply
144
+ ```
145
+
146
+ Streaming output is buffered until restoration completes — the user never sees raw placeholders.
147
+
148
+ ---
149
+
150
+ ## What gets detected
151
+
152
+ | Category | Examples | Severity |
153
+ |---|---|:---:|
154
+ | Personal & contact | Names, phone, email, address | High |
155
+ | Unique identifiers | SSN, passport, account, license plate | High |
156
+ | Secrets & access | Passwords, API keys, tokens, private URLs | High |
157
+ | Organisation & network | Company names, school names, IPs | High |
158
+ | Medical & narrative | PHI, treatments, diagnoses, code names | High |
159
+ | Numeric & temporal | Money, dates, percentages, counts, measurements, coordinates | High |
160
+
161
+ Detection is split into `GeneralPrivacyDetector` (non-computable text spans) and `DigitPrivacyDetector` (numeric/temporal values normalised for later local math). Each span becomes an indexed token — `<<ENTITY_TYPE_INDEX>>` — so the remote LLM can still track relationships (`PERSON_1` ≠ `PERSON_2`) without knowing who they are: e.g. `Alice Chen → <<PERSON_1>>`, `555-123-4567 → <<PHONE_1>>`, `$142,500 → <<FINANCE_1>>`, `Metformin 500mg → <<MEDICAL_1>>`.
162
+
163
+ ---
164
+
165
+ ## Why a small LLM, not regex or BERT-NER?
166
+
167
+ **TL;DR — regex catches the easy 20%; the other 80% needs context.** CloakBot uses both: regex on the fast path (emails, invoice numbers, transaction IDs, file paths — in [`privacy/core/detection/`](cloakbot/privacy/core/detection/)), and Gemma 4 E2B for everything regex and BERT-NER cannot do.
168
+
169
+ | Failure mode | Regex | BERT-NER (Presidio, spaCy) | **Gemma 4 E2B** |
170
+ |---|:---:|:---:|:---:|
171
+ | Known formats — email, SSN, credit card | ✓ | ✓ | ✓ |
172
+ | Disambiguate `"John"` as a placeholder vs a real customer | ✗ | ✗ | ✓ |
173
+ | Instructional numbers — *"give me 3 bullet points about Q4 earnings"* | tokenizes `3` (breaks the request) | varies by tag set | ✓ kept as task structure |
174
+ | Combination identifiers — *"67-year-old male diabetic in ZIP 90210"* | ✗ | ✗ | ✓ |
175
+ | Cross-turn entity disambiguation — *"someone else surnamed Lin"* ≠ existing `<<PERSON_1>>` Lin Zhiyuan | n/a | n/a | ✓ emits `new` |
176
+ | Indirect identifiers — *"the patient I mentioned earlier"* | ✗ | ✗ | ✓ |
177
+ | User-defined entities — *"also redact our codename Falcon"* | edit regex | retrain | edit prompt |
178
+ | Domain shift — chat logs vs news-trained NER | n/a | recall drops 20–40% | resilient |
179
+ | Multilingual (CN / JP / KR / EN) on one model | one regex set per locale | 600 MB+ per language | one 2B model |
180
+ | Computable normalization — `$1,200.50` → `1200.5` (ready for local math) | string-only | string-only | ✓ typed numeric |
181
+
182
+ A PII proxy that only catches the easy stuff is **strictly worse than no proxy** — users trust it. The real bar is reasoning about whether a token should be redacted *in this specific conversation*, a generative-LLM-shaped problem. Gemma 4 E2B is the one commercially-redistributable model that fits consumer hardware (~5 GB quantised, runs on a MacBook via Ollama), returns parseable JSON at T=0, and is multimodal and multilingual in one weight set — **the trust layer is the model**, not a chat rewriter bolted onto Presidio. The honest cost: ~50–200 ms per detector call vs regex's <1 ms, mitigated by concurrent general+digit detectors, regex on the fast path, and per-chunk concurrency. Full rationale, latency, and methodology in the [hackathon writeup](docs/HACKATHON_WRITEUP.md).
183
+
184
+ ---
185
+
186
+ ## Multi-agent architecture
187
+
188
+ ```
189
+ ┌─────────────────────────────── LOCAL TRUST ZONE ─────────────────────────────┐
190
+ │ │
191
+ │ User input ──► [ pre_llm_hook ] ──► [ PrivacyRuntime ] │
192
+ │ │ │
193
+ │ ┌──────────────────┬───────────────────┼─────────────────┐ │
194
+ │ ▼ ▼ ▼ ▼ │
195
+ │ PiiDetector ToolPrivacy VisualPrivacy DocChunker │
196
+ │ (general + digit) Interceptor Pipeline (long docs) │
197
+ │ │ (tool I/O) (OCR + bbox) │ │
198
+ │ └──────────────────┬───────────────────────┬─────────────┘ │
199
+ │ ▼ ▼ │
200
+ │ [ Session Vault ] [ Local Math Executor ] │
201
+ │ (placeholder ↔ raw map, (arithmetic-only AST, │
202
+ │ per-session, on disk) sandboxed) │
203
+ │ │
204
+ └──────────────────────────────────┬───────────────────────────────────────────┘
205
+ │ sanitised payload only
206
+ ────────────────────────────────┼─────────── REMOTE BOUNDARY ───────────────
207
+
208
+ [ Remote LLM ] (Claude / GPT / Gemini)
209
+ │ response re-enters local zone
210
+ ────────────────────────────────┼───────────────────────────────────────────
211
+
212
+ [ post_llm_hook ] → restore + per-turn report → User
213
+ ```
214
+
215
+ | Component | Role | Backend |
216
+ |---|---|---|
217
+ | `PrivacyRuntime` | Per-turn coordinator: sanitise, route, restore, audit | Python |
218
+ | `PiiDetector` | General + digit + intent detectors run concurrently, then deduplicated | Gemma 4 E2B |
219
+ | `ToolPrivacyInterceptor` (+ `chunking/`) | Tool I/O restoration, severity-gated approval, output sanitisation; long-document content-aware chunkers with cross-chunk vault coalesce | Gemma 4 E2B + rules |
220
+ | `VisualPrivacyPipeline` | OCR + bbox redaction + placeholder overlay + cross-modal recall bridge | Gemma 4 E2B + Pillow + Tesseract |
221
+ | `Session Vault` | Audit-traceable placeholder ↔ raw mapping with cross-turn alias reuse | JSON on disk |
222
+ | `Math Executor` | Local execution of remote-generated `<python_snippet_N>` blocks; AST-validated, arithmetic-only | Python AST sandbox |
223
+
224
+ Full component list and file tree in [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md).
225
+
226
+ ---
227
+
228
+ ## 📊 Evals — trust by measurement
229
+
230
+ We refused to ship trust-by-assertion. Three end-to-end leak eval layers run against the **production pipeline** and answer one question per run: *did any ground-truth identifying token reach the upstream payload?*
231
+
232
+ | Layer | Coverage | Headline | Cross-turn alias |
233
+ |---|---|---|---:|
234
+ | **A1 — text input** | 4 domains × 20 sessions × 902 entity-turn pairs | **7.98%** pair leak · **5.88%** token leak | **97.14%** |
235
+ | **A2 — visual** | 10 invoice seeds × 180 PII spans × 197 redaction boxes | **1.11%** span leak · **1.01%** token leak | n/a |
236
+ | **A3 — long-document** | 3 domains × 20 sessions × 1,790 pairs via chunker | **6.26%** pair leak · **6.63%** token leak | **93.86%** |
237
+
238
+ - **100% pair recall** cross-domain on `EMAIL · PHONE · FINANCE · IP · URL`
239
+ - **MEDICAL recall: 20% → 95%** via type-driven prompt iteration (rules → adjacent examples)
240
+ - **0 of 226** A3 seam leaks fall within the 300-char chunker overlap band — every long-doc leak is an intra-chunk detector miss, not a boundary failure
241
+
242
+ Full per-template breakdown, methodology, and self-caught eval bugs in [`docs/HACKATHON_WRITEUP.md`](docs/HACKATHON_WRITEUP.md). Reproducibility: one command per layer in `tests/eval/runners/`.
243
+
244
+ > *All p95 latency numbers measured with Gemma 4 E2B served via vLLM on an RTX 5090. The MacBook (Ollama) path is functionally end-to-end but slower — MacBook is the target hardware, not the measurement rig.*
245
+
246
+ ---
247
+
248
+ ## 🛠️ Setup
249
+
250
+ ### Install
251
+
252
+ **From PyPI (recommended)** — the WebUI is bundled, so no Node build is needed:
253
+
254
+ ```bash
255
+ pip install --pre cloakbot # 0.2.1 beta (privacy kernel); drop --pre once 0.2.1 is stable
256
+ ```
257
+
258
+ Prefer an isolated CLI install? `uv tool install --prerelease allow cloakbot` or `pipx install --pip-args=--pre cloakbot`. Optional chat channels: `pip install --pre 'cloakbot[matrix,discord,msteams]'`.
259
+
260
+ **From source** (latest `main` / development) — needs Node ≥24 to build the WebUI:
261
+
262
+ ```bash
263
+ git clone https://github.com/spire-studio/cloakbot.git && cd cloakbot
264
+ uv sync
265
+ cd webui && npm install && npm run build && cd ..
266
+ ```
267
+
268
+ > From a source checkout, prefix the `cloakbot` commands below with `uv run`.
269
+
270
+ ### 1. Bring your own local Gemma 4 detector
271
+
272
+ CloakBot's privacy guarantee depends on the PII detector running **on a host you control**. Any OpenAI-compatible server works (vLLM, Ollama, llama.cpp, …); we recommend **Gemma 4 E2B**. Pointing the detector at a *remote* endpoint (e.g. OpenRouter) ships raw, unsanitised input there for detection — that's **TEST-ONLY** and defeats the boundary.
273
+
274
+ **Ollama (macOS / Linux / WSL, no GPU):**
275
+
276
+ ```bash
277
+ curl -fsSL https://ollama.com/install.sh | sh
278
+ ollama pull gemma4:e2b # ships the model + an OpenAI-compatible endpoint in one tool
279
+ # → base URL http://127.0.0.1:11434/v1 · API key "ollama" (any value) · model gemma4:e2b
280
+ ```
281
+
282
+ **vLLM (GPU machine — fast, reproducible; the A1/A2/A3 eval path):**
283
+
284
+ ```bash
285
+ uv sync --extra vllm
286
+ uv run huggingface-cli login # accept the Gemma license at hf.co/google/gemma-4-E2B-it
287
+ vllm serve google/gemma-4-E2B-it --port 8000 --dtype bfloat16 --api-key <your-token>
288
+ # → base URL http://127.0.0.1:8000/v1 · API key <your-token> · model google/gemma-4-E2B-it
289
+ ```
290
+
291
+ ### 2. Configure & launch
292
+
293
+ ```bash
294
+ cloakbot onboard # set the remote LLM + [D] Privacy Detector
295
+ cloakbot gateway # serves the WebUI — open the URL it prints (default http://127.0.0.1:8765/)
296
+ ```
297
+
298
+ Set the detector's **base URL / API key / model** under `onboard` → **[D] Privacy Detector** (or later in the WebUI under **Settings → Privacy**), and the remote LLM (Claude / GPT / Gemini) in the same flow (or **Settings → Models**). The detector exposes an OpenAI-compatible surface used **only** for local PII detection — the remote LLM call is entirely separate.
299
+
300
+ Then drag [`docs/demo/demo_onboarding_memo.md`](docs/demo/demo_onboarding_memo.md) into the Composer to watch 20 PII entities masked end-to-end — click **Diff** on any bubble for the Local↔Remote view.
301
+
302
+ ---
303
+
304
+ ## 🗺️ Roadmap
305
+
306
+ ### ✅ Shipped — privacy kernel (`0.2.1b1`, 2026)
307
+
308
+ **Core privacy runtime** — April
309
+ - Split local detectors (general + digit) via Gemma 4 E2B
310
+ - Session Vault with JSON persistence + cross-turn alias reuse
311
+ - Math snippet contract + local AST-validated arithmetic executor
312
+ - IntentAnalyzer + chat/math routing
313
+ - `ToolPrivacyInterceptor` for tool I/O sanitisation + severity-gated approval
314
+
315
+ **Trust boundary expansion** — May
316
+ - ✓ Long-document chunker path (`ToolPrivacyDetector` + 4 content-aware chunkers: plaintext / JSON / HTML / Markdown)
317
+ - ✓ Visual pipeline: OCR + bbox redaction + placeholder overlay + cross-modal recall bridge
318
+ - ✓ WebUI document upload (text/plain, text/markdown ≤ 64 KB) via the same chunker-backed sanitizer
319
+ - ✓ Local↔Remote diff dialog with per-document entity highlighting
320
+ - ✓ Ollama as a first-class backend (no GPU required) — `ollama pull gemma4:e2b` ships the model + endpoint in one tool
321
+
322
+ **Trust by measurement** — May
323
+ - ✓ End-to-end leak eval harness (`tests/eval/runners/`)
324
+ - ✓ A1 / A2 / A3 layers — **2,872 entity-test instances** of receipts
325
+ - ✓ Type-driven detector prompts (MEDICAL recall 20% → 95%)
326
+ - ✓ Self-caught eval bugs surfaced and fixed (token-level scoring; full-value appearance tightening)
327
+
328
+ **Streaming restoration** — June
329
+ - ✓ `StreamingSanitizer` with a carry-over window — streamed tool output (exec / shell / long-task) is sanitised incrementally, never buffered whole
330
+ - ✓ Live placeholder→original restoration as the remote reply streams, with highlight / hover / diff in the WebUI
331
+
332
+ ### 🚀 Future
333
+
334
+ - **Domain-specific LoRA adapters** — fine-tune Gemma 4 E2B on vertical corpora (healthcare, legal, finance) to lift recall on domain-specific phrases. The same kernel, three adapters: pick by tenant.
335
+ - **ORG short / hyphenated name recall** (71.67% → 90% target) — the largest remaining A1 gap, addressable with the LoRA path above
336
+ - **Bilingual coverage** — Chinese-language eval templates + zh-CN detector prompt iteration
337
+ - **Per-turn detector batching** — Medical p95 6.2 s → < 2 s target
338
+ - **Encrypted Vault persistence** option for shared-machine deployments
339
+ - **Policy-driven severity tiers** beyond the current registry defaults (all `high` today)
340
+ - **Dataset / table-specific structured chunker** (CSV / Parquet) for analytics tool outputs
341
+
342
+ ---
343
+
344
+ ## Hackathon tracks
345
+
346
+ - **Main Track — Gemma 4 Good (Safety & Trust direction)** — Gemma 4 E2B as a local privacy kernel that enforces a pre-wire boundary before any byte reaches the remote LLM. Backed by 2,872 entity-test instances across A1 (text), A2 (visual), and A3 (long-document) leak evals — see [`docs/HACKATHON_WRITEUP.md`](docs/HACKATHON_WRITEUP.md).
347
+ - **Ollama Special Technology** — `ollama pull gemma4:e2b` ships the model + the OpenAI-compatible endpoint in one tool, then point the detector at `http://127.0.0.1:11434/v1`. **Gemma 4 is the trust layer; Ollama is the deployment layer.**
348
+
349
+ *Looking for the code exactly as submitted to the hackathon? `main` has since been rebased onto upstream nanobot — browse the [`hackathon-gemma4-2026-05`](https://github.com/spire-studio/cloakbot/tree/hackathon-gemma4-2026-05) tag for the submission snapshot.*
350
+
351
+ ---
352
+
353
+ ## ⭐ Star History
354
+
355
+ <a href="https://www.star-history.com/?repos=spire-studio%2Fcloakbot&type=date&logscale=&legend=top-left">
356
+ <picture>
357
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=spire-studio/cloakbot&type=date&theme=dark&legend=top-left" />
358
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/chart?repos=spire-studio/cloakbot&type=date&legend=top-left" />
359
+ <img alt="Star History Chart" src="https://api.star-history.com/chart?repos=spire-studio/cloakbot&type=date&legend=top-left" />
360
+ </picture>
361
+ </a>
362
+
363
+ ---
364
+
365
+ ## Credits & license
366
+
367
+ CloakBot is built on [nanobot](https://github.com/HKUDS/nanobot) (MIT License) by HKUDS. The channel integrations, session management, memory system, and CLI come from the upstream framework. CloakBot's privacy-specific work lives primarily under [`cloakbot/privacy/`](cloakbot/privacy/) (detection, vaulting, egress gates, streaming restoration, and the WebUI privacy surface), the local-detector client [`cloakbot/providers/detector.py`](cloakbot/providers/detector.py), the detector config (`PrivacyDetectorConfig`) in [`cloakbot/config/schema.py`](cloakbot/config/schema.py), and the runtime seams in [`cloakbot/agent/loop.py`](cloakbot/agent/loop.py).
368
+
369
+ Architecture, reliability, security, privacy-domain notes, and [design decisions](docs/design-docs/design-decisions.md) live under [`docs/`](docs/) — start with [`AGENTS.md`](AGENTS.md).
370
+
371
+ MIT License — see [`LICENSE`](LICENSE).