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.
- cloakbot-0.2.1b1/.gitignore +57 -0
- cloakbot-0.2.1b1/LICENSE +22 -0
- cloakbot-0.2.1b1/PKG-INFO +371 -0
- cloakbot-0.2.1b1/README.md +275 -0
- cloakbot-0.2.1b1/bridge/.nvmrc +1 -0
- cloakbot-0.2.1b1/bridge/package-lock.json +1416 -0
- cloakbot-0.2.1b1/bridge/package.json +26 -0
- cloakbot-0.2.1b1/bridge/src/index.ts +56 -0
- cloakbot-0.2.1b1/bridge/src/server.ts +155 -0
- cloakbot-0.2.1b1/bridge/src/types.d.ts +3 -0
- cloakbot-0.2.1b1/bridge/src/whatsapp.ts +293 -0
- cloakbot-0.2.1b1/bridge/tsconfig.json +16 -0
- cloakbot-0.2.1b1/cloakbot/__init__.py +49 -0
- cloakbot-0.2.1b1/cloakbot/__main__.py +8 -0
- cloakbot-0.2.1b1/cloakbot/agent/__init__.py +19 -0
- cloakbot-0.2.1b1/cloakbot/agent/autocompact.py +96 -0
- cloakbot-0.2.1b1/cloakbot/agent/context.py +280 -0
- cloakbot-0.2.1b1/cloakbot/agent/hook.py +141 -0
- cloakbot-0.2.1b1/cloakbot/agent/loop.py +1968 -0
- cloakbot-0.2.1b1/cloakbot/agent/memory.py +955 -0
- cloakbot-0.2.1b1/cloakbot/agent/model_presets.py +65 -0
- cloakbot-0.2.1b1/cloakbot/agent/progress_hook.py +178 -0
- cloakbot-0.2.1b1/cloakbot/agent/runner.py +1453 -0
- cloakbot-0.2.1b1/cloakbot/agent/skills.py +242 -0
- cloakbot-0.2.1b1/cloakbot/agent/subagent.py +401 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/__init__.py +31 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/apply_patch.py +290 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/base.py +296 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/cli_apps.py +133 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/context.py +60 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/cron.py +295 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/exec_session.py +598 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/file_state.py +205 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/filesystem.py +1046 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/image_generation.py +218 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/loader.py +116 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/long_task.py +272 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/mcp.py +1096 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/message.py +273 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/path_utils.py +30 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/registry.py +125 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/runtime_state.py +62 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/sandbox.py +55 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/schema.py +232 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/search.py +584 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/self.py +484 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/shell.py +652 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/spawn.py +96 -0
- cloakbot-0.2.1b1/cloakbot/agent/tools/web.py +864 -0
- cloakbot-0.2.1b1/cloakbot/api/__init__.py +1 -0
- cloakbot-0.2.1b1/cloakbot/api/server.py +399 -0
- cloakbot-0.2.1b1/cloakbot/apps/__init__.py +5 -0
- cloakbot-0.2.1b1/cloakbot/apps/cli/__init__.py +13 -0
- cloakbot-0.2.1b1/cloakbot/apps/cli/service.py +1238 -0
- cloakbot-0.2.1b1/cloakbot/apps/cli/utils.py +62 -0
- cloakbot-0.2.1b1/cloakbot/apps/protocol.py +56 -0
- cloakbot-0.2.1b1/cloakbot/bus/__init__.py +6 -0
- cloakbot-0.2.1b1/cloakbot/bus/events.py +53 -0
- cloakbot-0.2.1b1/cloakbot/bus/progress.py +70 -0
- cloakbot-0.2.1b1/cloakbot/bus/queue.py +44 -0
- cloakbot-0.2.1b1/cloakbot/bus/runtime_events.py +251 -0
- cloakbot-0.2.1b1/cloakbot/channels/__init__.py +6 -0
- cloakbot-0.2.1b1/cloakbot/channels/base.py +270 -0
- cloakbot-0.2.1b1/cloakbot/channels/dingtalk.py +759 -0
- cloakbot-0.2.1b1/cloakbot/channels/discord.py +818 -0
- cloakbot-0.2.1b1/cloakbot/channels/email.py +739 -0
- cloakbot-0.2.1b1/cloakbot/channels/feishu.py +1917 -0
- cloakbot-0.2.1b1/cloakbot/channels/manager.py +535 -0
- cloakbot-0.2.1b1/cloakbot/channels/matrix.py +1022 -0
- cloakbot-0.2.1b1/cloakbot/channels/mochat.py +943 -0
- cloakbot-0.2.1b1/cloakbot/channels/msteams.py +822 -0
- cloakbot-0.2.1b1/cloakbot/channels/napcat.py +579 -0
- cloakbot-0.2.1b1/cloakbot/channels/qq.py +701 -0
- cloakbot-0.2.1b1/cloakbot/channels/registry.py +95 -0
- cloakbot-0.2.1b1/cloakbot/channels/signal.py +1402 -0
- cloakbot-0.2.1b1/cloakbot/channels/slack.py +729 -0
- cloakbot-0.2.1b1/cloakbot/channels/telegram.py +1453 -0
- cloakbot-0.2.1b1/cloakbot/channels/websocket.py +1173 -0
- cloakbot-0.2.1b1/cloakbot/channels/websocket_privacy.py +185 -0
- cloakbot-0.2.1b1/cloakbot/channels/wecom.py +554 -0
- cloakbot-0.2.1b1/cloakbot/channels/weixin.py +1546 -0
- cloakbot-0.2.1b1/cloakbot/channels/whatsapp.py +383 -0
- cloakbot-0.2.1b1/cloakbot/cli/__init__.py +1 -0
- cloakbot-0.2.1b1/cloakbot/cli/commands.py +1940 -0
- cloakbot-0.2.1b1/cloakbot/cli/models.py +31 -0
- cloakbot-0.2.1b1/cloakbot/cli/onboard.py +1396 -0
- cloakbot-0.2.1b1/cloakbot/cli/stream.py +230 -0
- cloakbot-0.2.1b1/cloakbot/cloakbot.py +110 -0
- cloakbot-0.2.1b1/cloakbot/command/__init__.py +6 -0
- cloakbot-0.2.1b1/cloakbot/command/builtin.py +686 -0
- cloakbot-0.2.1b1/cloakbot/command/router.py +88 -0
- cloakbot-0.2.1b1/cloakbot/config/__init__.py +34 -0
- cloakbot-0.2.1b1/cloakbot/config/loader.py +177 -0
- cloakbot-0.2.1b1/cloakbot/config/paths.py +76 -0
- cloakbot-0.2.1b1/cloakbot/config/schema.py +590 -0
- cloakbot-0.2.1b1/cloakbot/cron/__init__.py +18 -0
- cloakbot-0.2.1b1/cloakbot/cron/service.py +664 -0
- cloakbot-0.2.1b1/cloakbot/cron/types.py +83 -0
- cloakbot-0.2.1b1/cloakbot/pairing/__init__.py +33 -0
- cloakbot-0.2.1b1/cloakbot/pairing/store.py +254 -0
- cloakbot-0.2.1b1/cloakbot/privacy/__init__.py +6 -0
- cloakbot-0.2.1b1/cloakbot/privacy/agents/__init__.py +15 -0
- cloakbot-0.2.1b1/cloakbot/privacy/agents/base.py +17 -0
- cloakbot-0.2.1b1/cloakbot/privacy/agents/classification/intent_analyzer.py +60 -0
- cloakbot-0.2.1b1/cloakbot/privacy/agents/workers/chat_agent.py +25 -0
- cloakbot-0.2.1b1/cloakbot/privacy/agents/workers/math_agent.py +22 -0
- cloakbot-0.2.1b1/cloakbot/privacy/compaction.py +326 -0
- cloakbot-0.2.1b1/cloakbot/privacy/compaction_provider.py +171 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/__init__.py +29 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/detection/chunking/__init__.py +67 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/detection/chunking/base.py +65 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/detection/chunking/html.py +122 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/detection/chunking/json_chunker.py +126 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/detection/chunking/markdown.py +150 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/detection/chunking/sniffer.py +81 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/detection/chunking/text.py +152 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/detection/detector.py +137 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/detection/digit_detector.py +105 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/detection/general_detector.py +335 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/detection/llm_json.py +174 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/detection/tool_detector.py +249 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/math/math_executor.py +328 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/math/math_helpers.py +184 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/sanitization/alias_resolver.py +97 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/sanitization/handler.py +129 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/sanitization/restorer.py +168 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/sanitization/sanitize.py +244 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/state/vault.py +838 -0
- cloakbot-0.2.1b1/cloakbot/privacy/core/types.py +267 -0
- cloakbot-0.2.1b1/cloakbot/privacy/document_redaction.py +109 -0
- cloakbot-0.2.1b1/cloakbot/privacy/egress_policy.py +284 -0
- cloakbot-0.2.1b1/cloakbot/privacy/goal_at_rest.py +65 -0
- cloakbot-0.2.1b1/cloakbot/privacy/hooks/context.py +51 -0
- cloakbot-0.2.1b1/cloakbot/privacy/hooks/post_llm.py +21 -0
- cloakbot-0.2.1b1/cloakbot/privacy/hooks/pre_llm.py +33 -0
- cloakbot-0.2.1b1/cloakbot/privacy/prompting/__init__.py +19 -0
- cloakbot-0.2.1b1/cloakbot/privacy/prompting/system_prompt.py +58 -0
- cloakbot-0.2.1b1/cloakbot/privacy/prompting/templates/privacy_mode.md +28 -0
- cloakbot-0.2.1b1/cloakbot/privacy/protocol/__init__.py +26 -0
- cloakbot-0.2.1b1/cloakbot/privacy/protocol/contracts.py +123 -0
- cloakbot-0.2.1b1/cloakbot/privacy/protocol/metrics.py +34 -0
- cloakbot-0.2.1b1/cloakbot/privacy/protocol/observability.py +85 -0
- cloakbot-0.2.1b1/cloakbot/privacy/protocol/replay.py +85 -0
- cloakbot-0.2.1b1/cloakbot/privacy/provider_egress_gate.py +197 -0
- cloakbot-0.2.1b1/cloakbot/privacy/runtime/__init__.py +3 -0
- cloakbot-0.2.1b1/cloakbot/privacy/runtime/pipeline.py +686 -0
- cloakbot-0.2.1b1/cloakbot/privacy/runtime/registry.py +15 -0
- cloakbot-0.2.1b1/cloakbot/privacy/runtime/routing.py +17 -0
- cloakbot-0.2.1b1/cloakbot/privacy/runtime/streaming_restorer.py +105 -0
- cloakbot-0.2.1b1/cloakbot/privacy/runtime/streaming_sanitizer.py +242 -0
- cloakbot-0.2.1b1/cloakbot/privacy/runtime/tool_interceptor.py +723 -0
- cloakbot-0.2.1b1/cloakbot/privacy/tool_models.py +143 -0
- cloakbot-0.2.1b1/cloakbot/privacy/transparency/report.py +180 -0
- cloakbot-0.2.1b1/cloakbot/privacy/visual_egress_gate.py +347 -0
- cloakbot-0.2.1b1/cloakbot/privacy/visual_redaction.py +1156 -0
- cloakbot-0.2.1b1/cloakbot/privacy/webui/__init__.py +45 -0
- cloakbot-0.2.1b1/cloakbot/privacy/webui/builders.py +224 -0
- cloakbot-0.2.1b1/cloakbot/privacy/webui/contracts.py +202 -0
- cloakbot-0.2.1b1/cloakbot/privacy/webui/history.py +69 -0
- cloakbot-0.2.1b1/cloakbot/privacy/webui/side_channel.py +328 -0
- cloakbot-0.2.1b1/cloakbot/providers/__init__.py +45 -0
- cloakbot-0.2.1b1/cloakbot/providers/anthropic_provider.py +692 -0
- cloakbot-0.2.1b1/cloakbot/providers/azure_openai_provider.py +186 -0
- cloakbot-0.2.1b1/cloakbot/providers/base.py +843 -0
- cloakbot-0.2.1b1/cloakbot/providers/bedrock_provider.py +760 -0
- cloakbot-0.2.1b1/cloakbot/providers/detector.py +77 -0
- cloakbot-0.2.1b1/cloakbot/providers/factory.py +248 -0
- cloakbot-0.2.1b1/cloakbot/providers/fallback_provider.py +273 -0
- cloakbot-0.2.1b1/cloakbot/providers/github_copilot_provider.py +261 -0
- cloakbot-0.2.1b1/cloakbot/providers/image_generation.py +1603 -0
- cloakbot-0.2.1b1/cloakbot/providers/openai_codex_provider.py +321 -0
- cloakbot-0.2.1b1/cloakbot/providers/openai_compat_provider.py +1486 -0
- cloakbot-0.2.1b1/cloakbot/providers/openai_responses/__init__.py +31 -0
- cloakbot-0.2.1b1/cloakbot/providers/openai_responses/converters.py +127 -0
- cloakbot-0.2.1b1/cloakbot/providers/openai_responses/parsing.py +424 -0
- cloakbot-0.2.1b1/cloakbot/providers/registry.py +533 -0
- cloakbot-0.2.1b1/cloakbot/providers/transcription.py +221 -0
- cloakbot-0.2.1b1/cloakbot/security/__init__.py +1 -0
- cloakbot-0.2.1b1/cloakbot/security/network.py +159 -0
- cloakbot-0.2.1b1/cloakbot/security/workspace_access.py +430 -0
- cloakbot-0.2.1b1/cloakbot/security/workspace_policy.py +85 -0
- cloakbot-0.2.1b1/cloakbot/session/__init__.py +5 -0
- cloakbot-0.2.1b1/cloakbot/session/goal_state.py +126 -0
- cloakbot-0.2.1b1/cloakbot/session/manager.py +749 -0
- cloakbot-0.2.1b1/cloakbot/session/turn_continuation.py +240 -0
- cloakbot-0.2.1b1/cloakbot/session/webui_turns.py +449 -0
- cloakbot-0.2.1b1/cloakbot/skills/README.md +32 -0
- cloakbot-0.2.1b1/cloakbot/skills/clawhub/SKILL.md +53 -0
- cloakbot-0.2.1b1/cloakbot/skills/cron/SKILL.md +57 -0
- cloakbot-0.2.1b1/cloakbot/skills/github/SKILL.md +48 -0
- cloakbot-0.2.1b1/cloakbot/skills/image-generation/SKILL.md +66 -0
- cloakbot-0.2.1b1/cloakbot/skills/long-goal/SKILL.md +79 -0
- cloakbot-0.2.1b1/cloakbot/skills/memory/SKILL.md +36 -0
- cloakbot-0.2.1b1/cloakbot/skills/my/SKILL.md +72 -0
- cloakbot-0.2.1b1/cloakbot/skills/my/references/examples.md +75 -0
- cloakbot-0.2.1b1/cloakbot/skills/skill-creator/SKILL.md +374 -0
- cloakbot-0.2.1b1/cloakbot/skills/skill-creator/scripts/init_skill.py +378 -0
- cloakbot-0.2.1b1/cloakbot/skills/skill-creator/scripts/package_skill.py +152 -0
- cloakbot-0.2.1b1/cloakbot/skills/skill-creator/scripts/quick_validate.py +213 -0
- cloakbot-0.2.1b1/cloakbot/skills/summarize/SKILL.md +67 -0
- cloakbot-0.2.1b1/cloakbot/skills/tmux/SKILL.md +121 -0
- cloakbot-0.2.1b1/cloakbot/skills/tmux/scripts/find-sessions.sh +112 -0
- cloakbot-0.2.1b1/cloakbot/skills/tmux/scripts/wait-for-text.sh +83 -0
- cloakbot-0.2.1b1/cloakbot/skills/update-setup/SKILL.md +123 -0
- cloakbot-0.2.1b1/cloakbot/skills/weather/SKILL.md +49 -0
- cloakbot-0.2.1b1/cloakbot/templates/AGENTS.md +23 -0
- cloakbot-0.2.1b1/cloakbot/templates/HEARTBEAT.md +14 -0
- cloakbot-0.2.1b1/cloakbot/templates/SOUL.md +20 -0
- cloakbot-0.2.1b1/cloakbot/templates/USER.md +49 -0
- cloakbot-0.2.1b1/cloakbot/templates/__init__.py +0 -0
- cloakbot-0.2.1b1/cloakbot/templates/agent/_snippets/untrusted_content.md +2 -0
- cloakbot-0.2.1b1/cloakbot/templates/agent/consolidator_archive.md +24 -0
- cloakbot-0.2.1b1/cloakbot/templates/agent/dream.md +105 -0
- cloakbot-0.2.1b1/cloakbot/templates/agent/evaluator.md +17 -0
- cloakbot-0.2.1b1/cloakbot/templates/agent/identity.md +34 -0
- cloakbot-0.2.1b1/cloakbot/templates/agent/max_iterations_message.md +1 -0
- cloakbot-0.2.1b1/cloakbot/templates/agent/platform_policy.md +10 -0
- cloakbot-0.2.1b1/cloakbot/templates/agent/skills_section.md +6 -0
- cloakbot-0.2.1b1/cloakbot/templates/agent/subagent_announce.md +8 -0
- cloakbot-0.2.1b1/cloakbot/templates/agent/subagent_system.md +19 -0
- cloakbot-0.2.1b1/cloakbot/templates/agent/tool_contract.md +67 -0
- cloakbot-0.2.1b1/cloakbot/templates/memory/MEMORY.md +23 -0
- cloakbot-0.2.1b1/cloakbot/templates/memory/__init__.py +0 -0
- cloakbot-0.2.1b1/cloakbot/tool_privacy.py +9 -0
- cloakbot-0.2.1b1/cloakbot/utils/__init__.py +42 -0
- cloakbot-0.2.1b1/cloakbot/utils/artifacts.py +122 -0
- cloakbot-0.2.1b1/cloakbot/utils/document.py +319 -0
- cloakbot-0.2.1b1/cloakbot/utils/evaluator.py +94 -0
- cloakbot-0.2.1b1/cloakbot/utils/file_edit_events.py +964 -0
- cloakbot-0.2.1b1/cloakbot/utils/gitstore.py +394 -0
- cloakbot-0.2.1b1/cloakbot/utils/helpers.py +639 -0
- cloakbot-0.2.1b1/cloakbot/utils/image_generation_intent.py +27 -0
- cloakbot-0.2.1b1/cloakbot/utils/llm_runtime.py +22 -0
- cloakbot-0.2.1b1/cloakbot/utils/logging_bridge.py +47 -0
- cloakbot-0.2.1b1/cloakbot/utils/media_decode.py +55 -0
- cloakbot-0.2.1b1/cloakbot/utils/path.py +107 -0
- cloakbot-0.2.1b1/cloakbot/utils/progress_events.py +101 -0
- cloakbot-0.2.1b1/cloakbot/utils/prompt_templates.py +35 -0
- cloakbot-0.2.1b1/cloakbot/utils/restart.py +84 -0
- cloakbot-0.2.1b1/cloakbot/utils/runtime.py +180 -0
- cloakbot-0.2.1b1/cloakbot/utils/searchusage.py +168 -0
- cloakbot-0.2.1b1/cloakbot/utils/subagent_channel_display.py +59 -0
- cloakbot-0.2.1b1/cloakbot/utils/tool_hints.py +142 -0
- cloakbot-0.2.1b1/cloakbot/web/__init__.py +8 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/MarkdownTextRenderer-DnRJ3Bsa.js +3 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/abap-NUN-Q4TY.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/abnf-D-KJbf1C.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/actionscript-DENL_Yxo.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/ada-LH5SZrhx.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/agda-ymtcdZdX.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/al-CJVAWKDz.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/antlr4-BMELX9Jd.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/apacheconf-BcTIfZ-R.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/apex-DX55Uwde.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/apl-vpZAny-b.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/applescript-CaPaYwG-.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/aql--wTUDf9B.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/arduino-CIKuiMMj.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/arff-BJFPZ3ZQ.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/asciidoc-Dz9LU0oo.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/asm6502-WnqbQVpP.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/asmatmel-5Jy3DrzW.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/aspnet-Bm3yfv9h.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/autohotkey-BeMG6bjj.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/autoit-Dt3Q7KNE.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/avisynth-_25jQ1mu.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/avro-idl-B_qGseSi.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/bash-Cb3UAMlT.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/basic-DgRegGrm.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/batch-DVsfxIac.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/bbcode-CN8dvzDf.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/bicep-CA94bLGb.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/birb-CtQq6iAZ.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/bison-CvtdVC8F.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/bnf-BWGPbtjg.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/brainfuck-Dj0-XgUQ.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/brightscript-B7D0klqQ.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/bro-f49XYRi4.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/bsl-BK1qQL1V.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/c-C0oRItof.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/cfscript-DOeQ7VDG.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/chaiscript-xYGnwzjJ.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/cil-eLAyeTPF.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/clojure-DgK4YDmn.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/cmake-CXLQNC9N.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/cobol-d9-VgeZD.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/coffeescript-C9QjHd1_.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/concurnas-bKB8OwZy.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/coq-CQYQuxb4.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/cpp-e-seuWBm.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/crystal-WWZ_tnQX.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/csharp-rMV9Zfra.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/cshtml-Ds09IOCc.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/csp-CQCQ0ZE3.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/css-extras-CT5A2Izd.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/csv-BgyMrcsA.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/cypher-DmelXpIf.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/d-VWCAEm1r.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/dart-CVJdj0-r.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/dataweave-hJYKzcPT.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/dax-C8SI5LyP.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/dhall-ZlvQUk6z.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/diff-DHVMP9tS.js +3 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/django-DcF8LBP-.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/dns-zone-file-WEIFK4Je.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/docker-VhAHakcV.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/dot-CD2DeVqg.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/ebnf-CuzNL4UB.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/editorconfig-D2zjbeHU.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/eiffel-DJ3ShHrF.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/ejs-7-hUFLy_.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/elixir-8xvh5cY_.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/elm-g7erWaDT.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/erb-B7Xt-BiE.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/erlang-DkxI4fpk.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/etlua-C2XEtv8g.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/excel-formula-CZSLAApX.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/factor-BxcDZoGu.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/false-BMVpOwHv.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/firestore-security-rules-BW9MFeh3.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/flow-Dlx8nrOL.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/fortran-7T9UcASY.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/fsharp-BAZLP3r3.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/ftl-Bc_oXPVP.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/gap-8IEH7qXG.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/gcode-CJYFbpnI.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/gdscript-DNzYL7bS.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/gedcom-CBgiY2w3.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/gherkin-B9TyT2N3.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/git-BsZy3BWd.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/glsl-CygM1cI3.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/gml-CEWHfET-.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/gn-DXi3n3PE.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/go-DU1aoKzc.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/go-module-BD-Mc9Hh.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/graphql--kXj6vcL.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/groovy-BLy61_og.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/haml-bPWdMu4i.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/handlebars-BMYf598U.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/haskell-D_VxTFgH.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/haxe-T1jkpIIT.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/hcl-PldULSBb.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/hlsl-CV7R57m6.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/hoon-CPa5nskQ.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/hpkp-DJfAmLW-.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/hsts-CxLYXpVn.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/http-B9Ds3pAZ.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/ichigojam-DVf-cIZC.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/icon-KWhYca5l.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/icu-message-format-C2lK5p-4.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/idris-BaY-k4HK.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/iecst-CxsHsf9f.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/ignore-DS80tY1X.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/imageEncode.worker-Cs1P3eq4.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/index-BPAapRgI.css +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/index-XC7Tun-1.js +512 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/inform7-Bq6ivJ_x.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/ini-ClDuxIIn.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/io-DMsvaBXO.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/j-1EMBPPgy.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/java-CewVao_H.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/javadoc-BMhUUrn0.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/javadoclike-DRcXw2x4.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/javastacktrace-cVgCwZsl.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/jexl-Cgr1JdcY.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/jolie-BsErGqHn.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/jq-BNzJiU3y.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/js-extras-Cle0v0Ni.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/js-templates-CRt74qtT.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/jsdoc-BqDpEoCE.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/json-C3Hv7pLs.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/json5-CgWTKuX0.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/jsonp-CF0DaYMl.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/jsstacktrace-DdTwpwd9.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/jsx-B2UQKFdi.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/julia-C9A4S2mY.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/katex-BSBacQyE.js +257 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/katex-wklAmtGL.css +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/keepalived-Bh4xvA_q.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/keyman-CNquq_6a.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/kotlin-Bdxl62Ap.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/kumir-CF1O59OV.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/kusto-CK-1V38p.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/latex-361E6eEC.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/latte-f86JSuho.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/less-Bi1_JqPO.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/lilypond-Cq-mKIqY.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/liquid-B4N2kZ3H.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/lisp-CW0qmQGp.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/livescript-D5FtAXwI.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/llvm-BV8wK6xF.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/log-D0hODZpk.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/lolcode-DHoRD95d.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/lua-CVi-soTA.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/magma-DvCCEyFl.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/makefile-BmIUjdPy.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/markdown-CE05kUpP.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/markdown-vendor-CHxCoe4r.js +51 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/markup-templating-DPnNaIIy.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/matlab-CscqyiC9.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/maxscript-CZ-oezbY.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/mel-Clp_NDCE.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/mermaid-DhQ9DOjk.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/mizar-CN0VJgC_.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/mongodb-C-4jspnJ.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/monkey-Dfc36AaJ.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/moonscript-DyASHGVA.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/n1ql-DxWPGEgd.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/n4js-CGSDOjR6.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/nand2tetris-hdl-CkGLHgHj.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/naniscript-ChIN67Bw.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/nasm-Bnt6aatk.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/neon-DECLa7BN.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/nevod-2fxCQtPo.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/nginx-CoGjQsmn.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/nim-BMpCszPC.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/nix-D_mQv5VI.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/nsis-BaqSa3Wz.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/objectivec-Dzemz2ja.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/ocaml-CNLwgV-_.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/opencl-DzvSb6Hj.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/openqasm-C4qCMzOe.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/oz-behEqsCQ.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/parigp-Ch6SZvgk.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/parser-BtGxkDWV.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/pascal-CmTgy_1Z.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/pascaligo-BXmCbm9G.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/pcaxis-DzyFSRg_.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/peoplecode-B0FPTfca.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/perl-VmqMidup.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/php-WU4kuGhf.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/php-extras-DipLCQnj.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/phpdoc-CUDU7T8Q.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/plsql-DGyiSrqR.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/powerquery-B7U3Mrpn.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/powershell-ZbXZQOaZ.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/processing-ByQRo6i7.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/prolog-BOvhxG3V.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/promql-C2CobPDE.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/properties-CwSf9g07.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/protobuf-B57RIxkn.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/psl-DzFyTHe1.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/pug-BH1QhRaq.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/puppet-Bs9vzkUe.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/pure-BdX0RpFB.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/purebasic-BQU22L1L.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/purescript-BagkDTwF.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/python-RwSVHJ9V.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/q-BET3zqr2.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/qml-CoQTBiQ8.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/qore-CLDloqZD.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/qsharp-CDXKQeBv.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/r-BgAHHb-4.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/racket-CZmbqa8w.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/reason-D0_MaL5W.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/regex-QM-tU3X2.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/rego-DjXu5pFv.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/renpy-hG_ow2kX.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/rest-ub8bBn-k.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/rip-DR0ywRNu.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/roboconf-B0rb3xgX.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/robotframework-BUno3CtF.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/ruby-Brn8fnNm.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/rust-Ck_uMGfC.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/sas-DSvGfcUx.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/sass-iA6MSihr.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/scala-EEfoM1jv.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/scheme-BBqT4W3K.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/scss-EDX5cncP.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/shell-session-CJFdfejh.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/smali-Bm6qyqwX.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/smalltalk-BHlu5omn.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/smarty-CTN6tCig.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/sml-DkSEEtgE.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/solidity-DbbwU6KF.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/solution-file-DjIYncCO.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/soy-D4HHWo9i.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/sparql-CsVa7hte.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/splunk-spl-BjJg2Exp.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/sqf-9Xk-yGkV.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/sql-YBattGiR.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/squirrel-BrO73Frc.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/stan-Bp1R52Lx.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/stylus-CYuOuTL2.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/swift-xHzlmVoR.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/syntax-highlight-DCgzSdVd.js +14 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/systemd-q770erU6.js +2 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/t4-cs-C5O5jKQ-.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/t4-templating-DSbTm9R0.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/t4-vb-D-3ClfEW.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/tap-CDX0b6dR.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/tcl-DN1Ucqga.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/textile-DLoqze5H.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/toml-BeKaK4mH.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/tremor-CEa3FcAW.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/tsx-pwqpn4KT.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/tt2-Cl1RsxSw.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/turtle-DZqESLx2.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/twig-R1TH6YUG.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/typescript-CsCgqoRI.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/typoscript-BVuqnMDP.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/unrealscript-Am1hcp0G.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/uorazor-C9OiWvz8.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/uri-MwZhKeWh.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/v-CIC4n_ke.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/vala-DO5cmjce.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/vbnet-CJjFEgIg.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/velocity-cr2eidoW.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/verilog-C_HsAsqe.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/vhdl-BwBD3DKL.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/vim-Dqw9xkI1.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/visual-basic-DqvyCv2_.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/warpscript-DJL-COd1.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/wasm-KvauVSwO.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/web-idl-BxYvb2Gb.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/wiki-BHXLza-L.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/wolfram-kAMBUx9a.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/wren-Crw12_Hv.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/xeora-CWky1D6u.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/xml-doc-D1sLufgd.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/xojo-DZgGZigC.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/xquery-Dg59bIp5.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/yaml-C-mPAAtt.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/yang-B16K-lne.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/assets/zig-DOLkVX_D.js +1 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/brand/cloakbot_apple_touch.png +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/brand/cloakbot_favicon_32.png +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/brand/cloakbot_icon.png +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/brand/cloakbot_logo.png +0 -0
- cloakbot-0.2.1b1/cloakbot/web/dist/index.html +191 -0
- cloakbot-0.2.1b1/cloakbot/webui/__init__.py +2 -0
- cloakbot-0.2.1b1/cloakbot/webui/cli_apps_api.py +93 -0
- cloakbot-0.2.1b1/cloakbot/webui/gateway_services.py +70 -0
- cloakbot-0.2.1b1/cloakbot/webui/gateway_tokens.py +82 -0
- cloakbot-0.2.1b1/cloakbot/webui/http_utils.py +151 -0
- cloakbot-0.2.1b1/cloakbot/webui/mcp_presets_api.py +1318 -0
- cloakbot-0.2.1b1/cloakbot/webui/mcp_presets_runtime.py +5 -0
- cloakbot-0.2.1b1/cloakbot/webui/media_api.py +284 -0
- cloakbot-0.2.1b1/cloakbot/webui/media_gateway.py +92 -0
- cloakbot-0.2.1b1/cloakbot/webui/privacy_routes.py +79 -0
- cloakbot-0.2.1b1/cloakbot/webui/settings_api.py +1446 -0
- cloakbot-0.2.1b1/cloakbot/webui/settings_routes.py +356 -0
- cloakbot-0.2.1b1/cloakbot/webui/sidebar_state.py +196 -0
- cloakbot-0.2.1b1/cloakbot/webui/thread_disk.py +31 -0
- cloakbot-0.2.1b1/cloakbot/webui/transcript.py +922 -0
- cloakbot-0.2.1b1/cloakbot/webui/websocket_logging.py +45 -0
- cloakbot-0.2.1b1/cloakbot/webui/workspaces.py +283 -0
- cloakbot-0.2.1b1/cloakbot/webui/ws_http.py +513 -0
- cloakbot-0.2.1b1/docs/README.md +35 -0
- cloakbot-0.2.1b1/docs/exec-plans/README.md +40 -0
- cloakbot-0.2.1b1/pyproject.toml +209 -0
- 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/
|
cloakbot-0.2.1b1/LICENSE
ADDED
|
@@ -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).
|